web-dev-qa-db-fra.com

Méthode portable pour vérifier si le répertoire existe [Windows/Linux, C]

Je voudrais vérifier si un répertoire donné existe. Je sais comment faire cela 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 il me faut un moyen portable de le faire. Existe-t-il un moyen de vérifier si un répertoire existe quel que soit le système d'exploitation utilisé? Peut-être que C standard façon bibliothèque? 

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

Je termine avec ceci, AT AU MOINS POUR MAINTENANT:

#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;
}
48
ivy

stat () fonctionne également sous Linux., UNIX et Windows:

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

struct stat info;

if( stat( pathname, &info ) != 0 )
    printf( "cannot access %s\n", pathname );
else if( info.st_mode & S_IFDIR )  // S_ISDIR() doesn't exist on my windows 
    printf( "%s is a directory\n", pathname );
else
    printf( "%s is no directory\n", pathname );
75
Ingo Leonhardt

Utilisez boost :: système de fichiers , cela vous donnera un moyen portable de faire ce genre de choses et résumera tous les détails laids pour vous.

3
Tony The Lion

Vous pouvez utiliser le GTK glib pour faire abstraction du contenu du système d'exploitation.

glib fournit une fonction g_dir_open () qui devrait faire l'affaire.

1
Mali

Depuis que j'ai trouvé que la réponse approuvée ci-dessus manque de clarté et que l'op fournit une solution incorrecte qu'il/elle utilisera. J'espère donc que l'exemple ci-dessous aidera les autres. La solution est aussi plus ou moins portable.

/******************************************************************************
 * Checks to see if a directory exists. Note: This method only checks the
 * existence of the full path AND if path leaf is a dir.
 *
 * @return  >0 if dir exists AND is a dir,
 *           0 if dir does not exist OR exists but not a dir,
 *          <0 if an error occurred (errno is also set)
 *****************************************************************************/
int dirExists(const char* const path)
{
    struct stat info;

    int statRC = stat( path, &info );
    if( statRC != 0 )
    {
        if (errno == ENOENT)  { return 0; } // something along the path does not exist
        if (errno == ENOTDIR) { return 0; } // something in path prefix is not a dir
        return -1;
    }

    return ( info.st_mode & S_IFDIR ) ? 1 : 0;
}
0
Adam Parsons