94 votes

Moyen portable de vérifier si un répertoire existe [Windows/Linux, C]

Je voudrais vérifier si un répertoire donné existe. Je sais comment le faire sous Windows :

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

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

et Linux :

DIR* dir = opendir("mydir");
if (dir)
{
    /* Directory exists. */
    closedir(dir);
}
else if (ENOENT == errno)
{
    /* Directory does not exist. */
}
else
{
    /* opendir() failed for some other reason. */
}

Mais j'ai besoin d'un moyen portable pour le faire Existe-t-il un moyen de vérifier si un répertoire existe quel que soit le système d'exploitation que j'utilise ? Peut-être la bibliothèque standard C ?

Je sais que je peux utiliser les directives des préprocesseurs et appeler ces fonctions sur différents systèmes d'exploitation, mais ce n'est pas la solution que je recherche.

JE ME RETROUVE AVEC CECI, DU MOINS POUR L'INSTANT :

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>

int dirExists(const char *path)
{
    struct stat info;

    if(stat( path, &info ) != 0)
        return 0;
    else if(info.st_mode & S_IFDIR)
        return 1;
    else
        return 0;
}

int main(int argc, char **argv)
{
    const char *path = "./TEST/";
    printf("%d\n", dirExists(path));
    return 0;
}

0voto

littleom Points 31

Les exemples ci-dessus n'utilisent pas [_access]1 qui peut être utilisé pour Windows et Linux. Exemple de code (Windows) pour tester avec [stat]2, _access() et les derniers [exists]3 du système de fichiers.

#include <iostream>
#include <Windows.h>
#include <io.h>
#include <filesystem>
#include <vector>
#include <string>

using namespace std;
namespace fs = std::filesystem;
std::vector<std::string> DirPaths
{
  "G:\\My-Shcool-2021-22",
  "\\\\192.168.111.8\\Oaco\\RotData\\VV-VA",
  "\\\\192.168.111.15\\5500\\C-drive\\Oaco\\RotateEarthProject",   "\\\\192.168.111.18\\d$\\Mercurial\\Workspace\\HideMoon\\Win32\\Debug", 
"Z:\\SuperSaver" //mapped network drive; symbolic link
};
/* test if the path is a directory
*/
void TestDirExists ()
{
int erno =-1;
struct stat  info {};
auto ErrorMsg = [&](std::string path) 
{
    _get_errno(&erno);
    if (erno == EACCES)
        cout << "access denied  " << path << endl;
    else if (erno == ENOENT)
        cout << "dir path not found  " << path << endl;
    else if (erno == EINVAL)
        cout << "invalid parameter  " << path << endl;        
};

for (const auto &dp : DirPaths)
{
    erno = -1;
    if (stat(dp.c_str(), &info) != 0)
        ErrorMsg(dp);        
    if (_access(dp.c_str(), 0) != 0)
        ErrorMsg(dp);       
    if (fs::exists(dp)==0)
        ErrorMsg(dp);
    if(erno < 0)
         cout << "#Dir Found: " << dp << endl;
}

} [1] : https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/access-waccess?view=msvc-170 [2] : https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/stat-functions?view=msvc-170 [3] : https://en.cppreference.com/w/cpp/filesystem/exists

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