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 라이브러리 사용)
편집: Linux에서 컴파일하려면 를 바꿉니다.<io.h>
와 함께<unistd.h>
그리고._access
와 함께access
플랫폼에 구애받지 않는 실제 솔루션의 경우 Boost File System 라이브러리를 사용하십시오.
#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;
}
다른 옵션은 셸 함수 PathFileExists()입니다.
이 함수는 "파일이나 디렉터리 등의 파일 시스템 개체에 대한 경로가 유효한지 여부를 결정합니다."
Shell Lightweight API(shlwapi.dll)로의 링크에 문제가 없는 경우 PathIsDirectory 함수를 사용할 수 있습니다.
그래서 이 질문은 엣지 케이스로 가득합니다.진짜 답은 다음과 같습니다.
BOOL DirectoryExists(LPCTSTR szPath, BOOL *exists)
{
*exists = FALSE;
size_t szLen = _tcslen(szPath);
if (szLen > 0 && szPath[szLen - 1] == '\\') --szLen;
HANDLE heap = GetProcessHeap();
LPCTSTR szPath2 = HeapAlloc(heap, 0, (szlen + 3) * sizeof(TCHAR));
if (!szPath2) return FALSE;
CopyMemory(szPath2, szPath, szLen * sizeof(TCHAR));
szPath2[szLen] = '\\';
szPath2[szLen + 1] = '.';
szPath2[szLen + 2] = 0;
DWORD dwAttrib = GetFileAttributes(szPath2);
HeapFree(heap, 0, szPath2);
if (dwAttrib != INVALID_FILE_ATTRIBUTES) {
*exists = TRUE; /* no point checking FILE_ATTRIBUTE_DIRECTORY on "." */
return TRUE;
}
/*
* If we get anything other than ERROR_PATH_NOT_FOUND then something's wrong.
* Could be hardware IO, lack of permissions, a symbolic link pointing to somewhere
* you don't have access, etc.
*/
return GetLastError() != ERROR_PATH_NOT_FOUND;
}
(의 는입니다.3번으로 나누다세 가지 경우가 있는데 모두 처리해야 합니다.존재하거나 존재하지 않거나 확인할 수 없습니다.SAN이 검사 기능에 NO를 반환하고 코드 맨 다음 줄에 데이터를 정리할 수 있도록 하는 작업을 수행 중 데이터가 손실되었습니다. 의 가 한 것과 주세요.File.Exists()
C#api API
하지만 나는 많은 수표들이 중복되는 것을 본다.if (
하지 않습니다.) CreateDirectory()
쓰세요;;;;;;;;;;;;;;;;;;;;;CreateDirectory() if (GetLastError() != 0 && GetLastError() != ERROR_ALREADY_EXISTS
로 하다.RemoveDirectory()
; 삭제만 하고 오류가 없는지 또는 경로를 찾을 수 없는지 확인합니다.
언급URL : https://stackoverflow.com/questions/6218325/how-do-you-check-if-a-directory-exists-on-windows-in-c
'sourcecode' 카테고리의 다른 글
Vue 및 Vuex를 사용하여 Firebase 인증이 작동하지 않음 (0) | 2022.08.16 |
---|---|
Java Array List 복사 (0) | 2022.08.16 |
Vuex에서 알 수 없는 돌연변이 유형 us (0) | 2022.08.16 |
vue-test-utils 설정 typeError: 문자열에 속성 '_Ctor'를 생성할 수 없습니다. (0) | 2022.08.16 |
'XMLHttpRequest has blocked by CORS policy' 수정 방법 리다이렉트에서는 1개의 루트만 사용할 수 없습니다. (0) | 2022.08.16 |