1. ホーム
  2. c

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

2022-03-04 20:58:14

質問

指定したディレクトリが存在するかどうかを確認したい。Windowsでのやり方は知っています。

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

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

とLinuxの2種類があります。

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に関係なく、ディレクトリが存在するかどうかをチェックする方法はありますか?Cの標準ライブラリ的な方法とか?

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

結局、今のところ、こんな感じです。

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

解決方法は?

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 );