programing tip

Windows에 C로 디렉토리가 있는지 어떻게 확인합니까?

itbloger 2020. 11. 24. 07:44
반응형

Windows에 C로 디렉토리가 있는지 어떻게 확인합니까?


질문

Windows C 응용 프로그램에서 지정된 경로가 있는지 확인하기 위해 함수에 전달 된 매개 변수의 유효성을 검사하고 싶습니다. *

Windows에 C로 디렉토리가 있는지 어떻게 확인합니까?

* 나는 당신이 존재를 확인하는 시간과 더 이상 존재하지 않는 경로를 사용하는 시간 사이에 경쟁 조건에 들어갈 수 있다는 것을 알고 있지만, 그것을 처리 할 수 ​​있습니다.

추가 배경

디렉토리가 존재하거나 존재하지 않는다는 것을 명시 적으로 아는 것은 권한이 작용할 때 까다로울 수 있습니다. 디렉터리가 있는지 확인하려고 시도 할 때 프로세스에 디렉터리 또는 상위 디렉터리에 액세스 할 수있는 권한이 없을 수 있습니다. 이것은 내 필요에 적합합니다 . 디렉터리가 존재하지 않거나 액세스 할 수없는 경우 둘 다 내 응용 프로그램에서 잘못된 경로 오류로 처리되므로 구분할 필요가 없습니다. 솔루션이 이러한 구분을 제공하는 경우 (가상) 보너스 포인트.

C 언어, C 런타임 라이브러리 또는 Win32 API의 모든 솔루션이 좋지만 이상적으로는 일반적으로로드되는 라이브러리 (예 : kernel32, user32 등)를 고수하고 비표준 라이브러리로드와 관련된 솔루션을 피하고 싶습니다. ( Shlwapi.dll의 PathFileExists 처럼 ). 다시 말하지만, 솔루션이 크로스 플랫폼 인 경우 (가상) 보너스 포인트.

관련

파일이 존재하는지 Win32 프로그램을 사용하지 않는지 어떻게 확인할 수 있습니까?


다음과 같이하십시오.

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

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

GetFileAttributes와 () 메소드의 Kernel32.dll에 포함된다.


다음은 완전히 플랫폼에 구애받지 않는 솔루션입니다 (표준 C 라이브러리 사용).

편집 : 이 리눅스에서 컴파일하려면, 교체 <io.h><unistd.h>_access함께 access. 실제 플랫폼에 구애받지 않는 솔루션의 경우 Boost FileSystem 라이브러리를 사용하십시오.

#include <io.h>     // For access().
#include <sys/types.h>  // For stat().
#include <sys/stat.h>   // For stat().

bool DirectoryExists( const char* absolutePath ){

    if( _access( absolutePath, 0 ) == 0 ){

        struct stat status;
        stat( absolutePath, &status );

        return (status.st_mode & S_IFDIR) != 0;
    }
    return false;
}

MBCS 및 UNICODE 빌드를 모두 지원하는 Windows 관련 구현 :

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

BOOL directory_exists( LPCTSTR absolutePath )
{
  if( _taccess_s( absolutePath, 0 ) == 0 )
  {
    struct _stat status;
    _tstat( absolutePath, &status );
    return (status.st_mode & S_IFDIR) != 0;
  }

  return FALSE;
}

Shell Lightweight API (shlwapi.dll)에 연결해도 괜찮다PathIsDirectory 함수를 사용할 수 있습니다 .


또 다른 옵션은 쉘 함수 PathFileExists ()입니다.

PathFileExists () 문서

이 기능은 "파일이나 디렉토리와 같은 파일 시스템 개체에 대한 경로가 유효한지 여부를 결정합니다."

참고 URL : https://stackoverflow.com/questions/6218325/how-do-you-check-if-a-directory-exists-on-windows-in-c

반응형