2014-12-11 3 views
1

하드 드라이브의 폴더가 있는지 MS VS 2013에 Visula C++ 콘솔 응용 프로그램이 있습니다. 나는 다음과 같은 방법으로 그것을 GetFileAttributes와() 함수를 사용GetFileAttributes() 함수가 폴더에 대한 상대 경로로 작동하지 않습니다.

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    string folderPath = argv[1]; 

    if (GetFileAttributes(folderPath.c_str()) == FILE_ATTRIBUTE_DIRECTORY) 
    { 
      // Do something here 
    } 
    else 
    { 
      // Also do something here 
    } 

    return 0; 
} 

그러나 GetFileAttributes와의 결과는() 나는 폴더로 (명령 행 인수에) 정규화 된 경로를 설정 한 경우에만 FILE_ATTRIBUTE_DIRECTORY (0x10을)과 같다 . 예 : "M : \ MS_VS2013_Projects \ WordsCounter \ Debug \ TextFiles_to_Test"여기서 "M"은 하드 드라이브 이름입니다. 하지만 (명령 행 인수에) 설정하는 상대 예를 들어 경로하려고하면 (또는 "TextFiles_to_Test \"또는 "\ TextFiles_to_Test."다음 GetFileAttributes와 "TextFiles_to_Test"또는 "TextFiles_to_TestM을") 잘못된 결과를 반환합니다 == 4294967295. 폴더에 대한 상대 경로의 경우 어떻게 올바른 resuli (0x10) 얻을 수 있습니까? 나는 너의 도움에 대해 대단히 감사 할 것이다.

+0

나는이 다음을 수행하는 경우 : ((GetFileAttributes와 (folderPath.c_str())을 0x10) == FILE_ATTRIBUTE_DIRECTORY)가 있기 때문에이 경우은 "만약 문"에 도움이되지 않는 경우에하는 것은도에 만족 존재하지 않는 폴더의 경우. – user3769902

+1

상대 경로는 app 디렉토리가 아닌 현재 작업 디렉토리 또는 드라이브에 대한 상대 경로입니다. 프로세스 당 하나의 CWD가 있지만 Windows는 각 드라이브의 작업 디렉토리를 숨겨진 환경 변수 (예 :'= C :')에 저장합니다. – eryksun

답변

0

이것은 Windows XP에만 국한되지 않습니다. Windows 7에서 일부 테스트를 수행했습니다. 상대 경로에서는 작동하지 않으며 "재분석 지점"에서는 작동하지 않습니다. 예를 들어, 지역화 된 버전의 폴더를 사용하면 작동하지 않습니다.

예 : 프랑스어 Windows OS에서는 다음 호출 중 첫 번째 호출 만 성공합니다.

DWORD dwAttr1 = ::GetFileAttributesW(L"C:\\Program Files"); 
DWORD dwAttr2 = ::GetFileAttributesW(L"Program Files"); //relative folder 
DWORD dwAttr3 = ::GetFileAttributesW(L"C:\\Programmes"); //NTFS Junction point 
DWORD dwAttr4 = ::GetFileAttributesW(L"Programmes");