76 votes

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

Question

Dans un Windows application C je veux valider un paramètre passé à une fonction afin de s'assurer que le chemin d'accès spécifié existe.*

Comment voulez-vous vérifier si un répertoire existe sur Windows en C?

*Je comprends que vous pouvez obtenir dans des conditions de course où entre le temps de vérifier l'existence et le temps que vous utilisez le chemin d'accès qu'il n'existe plus, mais je peux le gérer.

En Arrière-Plan Supplémentaire

Savoir explicitement qu'un répertoire s'il existe ou non peut être délicat lorsque les autorisations sont en jeu. Il est possible qu'en essayant de déterminer si le répertoire existe, le processus n'a pas les permissions pour accéder à l'annuaire ou un répertoire parent. C'est OK pour mes besoins. Si le répertoire n'existe pas, OU je ne peux pas y accéder, les deux sont traités comme un chemin d'accès non valide échec dans ma demande, donc je n'ai pas besoin de les différencier. (Virtuel) des points de bonus si votre solution pour cette distinction.

Toute solution dans le langage C, C runtime library, ou de l'API Win32 est bien, mais idéalement, j'aimerais stick pour les bibliothèques qui sont généralement chargées (par exemple, kernel32, user32, etc.) et d'éviter des solutions qui impliquent chargement non-standard des bibliothèques (comme PathFileExists dans Shlwapi.dll). Encore une fois, (Virtuel) des points de bonus si votre solution est multi-plateforme.

Liées

Comment peut-on vérifier si un fichier Existe ou pas à l'aide de programme Win32?

101voto

retrodrone Points 2979

Faites quelque chose comme ça:

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

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

La méthode GetFileAttributes () est incluse dans Kernel32.dll.

26voto

dario_ramos Points 2919

Voici une solution totalement indépendante de la plate-forme (utilisant la bibliothèque C standard)

Edit: Pour que cela soit compilé sous Linux, remplacez <io.h> par <unistd.h> et _access avec access . Pour une solution agnostique, utilisez la bibliothèque Boost FileSystem.

 #include <io.h>     // For access().
#include <sys/types.h>  // For stat().
#include <sys/stat.h>   // For stat().

bool DirectoryExists( const char* absolutePath ){

    if( _access( absolutePath, 0 ) == 0 ){

        struct stat status;
        stat( absolutePath, &status );

        return (status.st_mode & S_IFDIR) != 0;
    }
    return false;
}
 

Une implémentation spécifique à Windows qui prend en charge les versions MBCS et UNICODE:

 #include <io.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <tchar.h>

BOOL directory_exists( LPCTSTR absolutePath )
{
  if( _taccess_s( absolutePath, 0 ) == 0 )
  {
    struct _stat status;
    _tstat( absolutePath, &status );
    return (status.st_mode & S_IFDIR) != 0;
  }

  return FALSE;
}
 

9voto

Simon Mourier Points 49585

Si la liaison à l'API Lightweight Shell (shlwapi.dll) vous convient, vous pouvez utiliser la fonction PathIsDirectory .

5voto

Greg Points 41

Une autre option est la fonction shell PathFileExists ()

Documentation de PathFileExists ()

Cette fonction "Détermine si un chemin d'accès à un objet de système de fichiers tel qu'un fichier ou un répertoire est valide."

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