Fichier ou Répertoire sous Windows...

Signaler
Messages postés
7
Date d'inscription
lundi 7 juin 2004
Statut
Membre
Dernière intervention
27 juin 2004
-
Messages postés
7
Date d'inscription
lundi 7 juin 2004
Statut
Membre
Dernière intervention
27 juin 2004
-
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

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

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
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++
Messages postés
7
Date d'inscription
lundi 7 juin 2004
Statut
Membre
Dernière intervention
27 juin 2004

Merci BruNews pour ton conseil et merci pour ta réponse à Samir (DeAtHCrAsH)... A+