web-dev-qa-db-ja.com

ディレクトリが存在するかどうかを確認するポータブルな方法[Windows / Linux、C]

特定のディレクトリが存在するかどうかを確認したいと思います。私はWindowsでこれを行う方法を知っています:

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

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

および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. */
}

しかし、これを行うための移植可能な方法が必要です.. OS Imが何を使用していても、ディレクトリが存在するかどうかを確認する方法はありますか?たぶんC標準ライブラリの方法?

プリプロセッサディレクティブを使用して、異なるOSでこれらの関数を呼び出すことができることは知っていますが、それは私が求めている解決策ではありません。

私はこれで終わります、ATとりあえず:

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

stat() は、Linux、UNIX、および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 );
84
Ingo Leonhardt

boost :: filesystem を使用すると、これらの種類のことを行うポータブルな方法が提供され、すべてのい詳細が抽象化されます。

3
Tony The Lion

GTK glib を使用して、OSのものから抽象化できます。

glibは g_dir_open() 関数を提供します。

1
Mali

上記の承認された答えには明確さが欠けていることがわかったので、opは彼/彼女が使用する間違ったソリューションを提供します。したがって、以下の例が他の人に役立つことを願っています。このソリューションは、多かれ少なかれ移植性があります。

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