IT TIP

디렉토리 존재 여부를 확인하는 이식 가능한 방법 [Windows / Linux, C]

itqueen 2020. 12. 30. 19:57
반응형

디렉토리 존재 여부를 확인하는 이식 가능한 방법 [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에서 해당 함수를 호출 할 수 있다는 것을 알고 있지만 이것이 내가 요구하는 솔루션이 아닙니다.

나는 적어도 지금은 이것으로 끝납니다.

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

boost :: filesystem을 사용 하면 이러한 종류의 작업을 수행 할 수있는 휴대용 방법을 제공하고 모든 추악한 세부 사항을 추상화 할 수 있습니다.


GTK glib사용하여 OS 항목에서 추상화 할 수 있습니다 .

glib provides a g_dir_open() function which should do the trick.


Since I found that the above approved answer lacks some clarity and the op provides an incorrect solution that he/she will use. I therefore hope that the below example will help others. The solution is more or less portable as well.

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

ReferenceURL : https://stackoverflow.com/questions/18100097/portable-way-to-check-if-directory-exists-windows-linux-c

반응형