Fichier ou Répertoire sous Windows...

alca06 Messages postés 7 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 27 juin 2004 - 23 juin 2004 à 14:02
alca06 Messages postés 7 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 27 juin 2004 - 24 juin 2004 à 09:58
Quelle est la meilleure solution, la plus rapide et la plus sûre... pour savoir si le fichier existe ou si le nom spécifié est un répertoire ?

#define IsDirectory(path) ((::GetFileAttributes(path)&FILE_ATTRIBUTE_DIRECTORY)?(TRUE):(FALSE))

#define FileExists(path) ((::GetFileAttributes(path)!=0xFFFFFFFF)?(TRUE):(FALSE))

typedef BOOL (* PATHFILEEXISTS)(LPCSTR);

BOOL WSPathFileExists(const char *pszPath) {

BOOL bReturn = FALSE;
HMODULE hLib = (HMODULE)LoadLibrary("SHLWAPI.DLL");

if (hLib) {
PATHFILEEXISTS fpFuncAddress = (PATHFILEEXISTS)GetProcAddress(hLib, (LPCSTR)"PathFileExistsA");
if (fpFuncAddress !NULL) { bReturn (*fpFuncAddress)(pszPath); }
FreeLibrary(hLib);

}

return (bReturn);

}

typedef BOOL (* PATHISDIRECTORY)(LPCSTR);

BOOL WSPathIsDirectory(const char *pszPath) {

BOOL bReturn = FALSE;
HMODULE hLib = (HMODULE)LoadLibrary("SHLWAPI.DLL");

if (hLib) {
PATHISDIRECTORY fpFuncAddress = (PATHISDIRECTORY)GetProcAddress(hLib, (LPCSTR)"PathIsDirectoryA");
if (fpFuncAddress !NULL) { bReturn (*fpFuncAddress)(pszPath); }
FreeLibrary(hLib);

}

return (bReturn);
}

4 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 juin 2004 à 19:59
if(GetFileAttributes(szfile) & 0x80000000) ABSENT
Il n'y aura rien de plus rapide sur win32.

ciao...
BruNews, Admin CS, MVP Visual C++
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
24 juin 2004 à 00:24
Brunews> Tu les trouves ou toutes ces constantes ? (0x80000000)
Ca correspond a quoi exactement ?
Quand tu mets un seul "&" ca correspond a quoi exactement ?

Samir
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 juin 2004 à 00:43
par simple logique, si le fichier ou dossier passe en param n'est pas trouve, c'est le seul cas ou le bit 31 (le dernier) est positionne.
'&' est test binaire, c'est le AND en logique booleenne.
Quand on met cela comme ici dans un 'if', le compilo comprend qu'on ne veut pas affecter la valeur mais seulement voir l'etat du test, il va donc generer le code asm correct:
test eax, 80000000h
qui est la plus rapide, le 'and' aurait modifie 'eflags' et eax alors que 'test' modifie 'eflags' et stoppe son travail.

ciao...
BruNews, Admin CS, MVP Visual C++
0
alca06 Messages postés 7 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 27 juin 2004
24 juin 2004 à 09:58
Merci BruNews pour ton conseil et merci pour ta réponse à Samir (DeAtHCrAsH)... A+
0
Rejoignez-nous