81 votes

Comment vérifier si un fichier existe ou non en utilisant un programme Win32 ?

Comment vérifier si un fichier existe ou non à l'aide d'un programme Win32 ? Je travaille pour une application Windows Mobile.

3 votes

Std::filesystem::exists() à partir de C++17

224voto

Zach Burlingame Points 7232

Utilisez GetFileAttributes pour vérifier que l'objet système de fichiers existe et qu'il ne s'agit pas d'un répertoire.

BOOL FileExists(LPCTSTR szPath)
{
  DWORD dwAttrib = GetFileAttributes(szPath);

  return (dwAttrib != INVALID_FILE_ATTRIBUTES && 
         !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}

Copié de Comment vérifier si un répertoire existe sous Windows en C ?

7 votes

+1 à cause d'un court exemple de code. Les exemples de code sont un gain de temps pour commencer.

0 votes

Je tiens à noter que votre fonction renvoie bool et non BOOL.

0 votes

Pour le C++, oui, pour le C, c'est un BOOL.

39voto

codaddict Points 154968

Vous pouvez utiliser la fonction GetFileAttributes . Il retourne 0xFFFFFFFF si le fichier n'existe pas.

17 votes

Histoire intéressante sur GetFileAttributes et pourquoi c'est la méthode préférée dans le code Windows par Raymond Chen : blogs.msdn.com/b/oldnewthing/archive/2007/23/10/5612082.aspx

2 votes

Vous devez vérifier si l'objet est un répertoire.

12 votes

En fait, il renvoie INVALID_FILE_ATTRIBUTES si le fichier n'existe pas. Sur 64 bits, cela pourrait être 0xFFFFFFFFFFFFFFFF .

29voto

Preet Sangha Points 39414

Vous pouvez appeler FindFirstFile .

Voici un échantillon que je viens de créer :

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

int fileExists(TCHAR * file)
{
   WIN32_FIND_DATA FindFileData;
   HANDLE handle = FindFirstFile(file, &FindFileData) ;
   int found = handle != INVALID_HANDLE_VALUE;
   if(found) 
   {
       //FindClose(&handle); this will crash
       FindClose(handle);
   }
   return found;
}

void _tmain(int argc, TCHAR *argv[])
{
   if( argc != 2 )
   {
      _tprintf(TEXT("Usage: %s [target_file]\n"), argv[0]);
      return;
   }

   _tprintf (TEXT("Looking for file is %s\n"), argv[1]);

   if (fileExists(argv[1])) 
   {
      _tprintf (TEXT("File %s exists\n"), argv[1]);
   } 
   else 
   {
      _tprintf (TEXT("File %s doesn't exist\n"), argv[1]);
   }
}

0 votes

Vous avez oublié d'appeler FindClose . Et vous ne pouvez pas retourner une valeur à partir d'une fonction vide.

4 votes

Demi-corrigé. Vous devez vérifier la présence de FILE_ATTRIBUTE_DIRECTORY.

2 votes

Voir les autres réponses pour de meilleures façons de procéder. En outre, le code ne sera même pas compilé tel quel en raison de l'utilisation d'argv[1] dans fileExists() ;

10voto

Adrian McCarthy Points 17018

Une autre option : PathFileExists .

Mais je choisirais probablement GetFileAttributes .

2 votes

En outre PathFileExists nécessite l'utilisation de "Shlwapi.dll" (qui n'est pas disponible sur certaines versions de Windows) et est légèrement plus lent que la méthode suivante GetFileAttributes .

0 votes

Mais cela ne vous dit pas si un fichier ou un répertoire existe.

0 votes

À propos, PathFileExists n'est qu'une enveloppe pour GetFileAttributes avec une enveloppe supplémentaire SetErrorMode(SEM_FAILCRITICALERRORS).

0voto

fanzhou Points 41

Vous pouvez essayer d'ouvrir le fichier. Si cela échoue, cela signifie qu'il n'existe pas dans la plupart des cas.

0 votes

Je choisirais CreateFile -> CloseHandle. C'est le plus simple et le moins cher.

7 votes

L'ouverture d'un fichier peut également échouer si le fichier existe mais que l'utilisateur ne dispose pas des privilèges suffisants pour l'ouvrir. De nos jours, c'est un très situation commune.

0 votes

Sans compter que ce n'est pas le moins cher, car le fichier peut se trouver sur un partage réseau, ce qui ajoute de la latence pour chaque appel, et avec CloseHandle, vous avez deux appels au lieu d'un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X