50 votes

Comment vérifier l'existence d'un répertoire en utilisant C++ et winAPI ?

Comment vérifier l'existence d'un répertoire à l'aide de C++ et de l'API Windows ?

0 votes

Pourquoi ne pas faire BOOL PathFileExists(pszPath); comme indiqué dans msdn.microsoft.com/en-us/library/Windows/desktop/ ?

0 votes

Depuis C++ 17, il n'est plus nécessaire de s'appuyer sur des API spécifiques à la plate-forme pour cela : std::filesystem::exists(dirPath) && std::filesystem::is_directory(dirPath) . Voir documents .

91voto

FailedDev Points 15104

Voici une fonction simple qui fait exactement cela :

#include <windows.h>
#include <string>

bool dirExists(const std::string& dirName_in)
{
  DWORD ftyp = GetFileAttributesA(dirName_in.c_str());
  if (ftyp == INVALID_FILE_ATTRIBUTES)
    return false;  //something is wrong with your path!

  if (ftyp & FILE_ATTRIBUTE_DIRECTORY)
    return true;   // this is a directory!

  return false;    // this is not a directory!
}

10 votes

GetFileAttributes() retours INVALID_FILE_ATTRIBUTES en cas de défaillance. Vous devez utiliser GetLastError() pour découvrir ce qu'est réellement cet échec. S'il renvoie ERROR_PATH_NOT_FOUND , ERROR_FILE_NOT_FOUND , ERROR_INVALID_NAME ou ERROR_BAD_NETPATH alors elle n'existe pas vraiment. En revanche, s'il renvoie la plupart des autres erreurs, c'est qu'il existe bel et bien au chemin spécifié, mais que ses attributs ne sont tout simplement pas accessibles.

3 votes

Pour ceux qui tombent sur cette réponse, gardez à l'esprit que le code ci-dessus est ANSI et non Unicode. Pour l'Unicode moderne, il est préférable de prendre un paramètre LPCTSTR comme dans l'extrait de cette autre réponse de stackoverflow : stackoverflow.com/a/6218445 . (Le LPCTSTR sera traduit en wchar_t* par le compilateur). Vous pouvez ensuite envelopper cette fonction compatible avec l'Unicode pour qu'elle prenne un code C++ std::wstring en std::string .

10voto

Simon Mourier Points 49585

Si la liaison avec l'API shell Lightweight (shlwapi.dll) vous convient, vous pouvez utiliser la commande Fonction PathIsDirectory

5voto

Ce code pourrait fonctionner :

//if the directory exists
 DWORD dwAttr = GetFileAttributes(str);
 if(dwAttr != 0xffffffff && (dwAttr & FILE_ATTRIBUTE_DIRECTORY))

2voto

0,1 seconde Recherche Google :

BOOL DirectoryExists(const char* dirName) {
  DWORD attribs = ::GetFileAttributesA(dirName);
  if (attribs == INVALID_FILE_ATTRIBUTES) {
    return false;
  }
  return (attribs & FILE_ATTRIBUTE_DIRECTORY);
}

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