web-dev-qa-db-ger.com

Portable Methode zur Überprüfung, ob das Verzeichnis existiert [Windows/Linux, C]

Ich möchte prüfen, ob ein bestimmtes Verzeichnis existiert. Ich weiß, wie das unter Windows geht: 

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

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

und 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. */
}

Aber ich brauche eine tragbare Möglichkeit, dies zu tun. Gibt es eine Möglichkeit, zu überprüfen, ob ein Verzeichnis vorhanden ist, unabhängig davon, was OS Im verwendet? Vielleicht C-Standardbibliothek? 

Ich weiß, dass ich Präprozessor-Direktiven verwenden und diese Funktionen auf verschiedenen Betriebssystemen aufrufen kann, aber das ist nicht die Lösung, nach der ich fragen möchte.

Ich beende mich mit diesem, AT LEAST FOR JETZT:

#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 () funktioniert auch unter Linux., UNIX und 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

Verwenden Sie boost :: filesystem , mit dem Sie diese Dinge auf tragbare Weise ausführen können und alle hässlichen Details für Sie abstrahieren können.

3
Tony The Lion

Sie können die Glibberkennung GTK verwenden, um von OS-Elementen zu abstrahieren.

glib bietet eine g_dir_open () - Funktion, die den Trick ausführen sollte.

1
Mali

Da ich herausfand, dass die oben genannte genehmigte Antwort etwas an Klarheit fehlt und die Operation eine falsche Lösung darstellt, die sie verwenden wird. Ich hoffe daher, dass das unten stehende Beispiel anderen helfen wird. Die Lösung ist auch mehr oder weniger tragbar.

/******************************************************************************
 * 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