2012-09-11 4 views
6

받기 : 상대 디렉토리 ./test/*에 각 파일의 이름을 인쇄WIN32_FIND_DATA -이 같은 것을 사용하고 절대 경로

std::string tempDirectory = "./test/*"; 

WIN32_FIND_DATA directoryHandle; 
memset(&directoryHandle, 0, sizeof(WIN32_FIND_DATA));//perhaps redundant??? 

std::wstring wideString = std::wstring(tempDirectory.begin(), tempDirectory.end()); 
LPCWSTR directoryPath = wideString.c_str(); 

//iterate over all files 
HANDLE handle = FindFirstFile(directoryPath, &directoryHandle); 
while(INVALID_HANDLE_VALUE != handle) 
{ 
    //skip non-files 
    if (!(directoryHandle.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
    { 
     //convert from WCHAR to std::string 
     size_t size = wcslen(directoryHandle.cFileName); 
     char * buffer = new char [2 * size + 2]; 
     wcstombs(buffer, directoryHandle.cFileName, 2 * size + 2); 
     std::string file(buffer); 
     delete [] buffer; 

     std::cout << file; 
    } 

    if(FALSE == FindNextFile(handle, &directoryHandle)) break; 
} 

//close the handle 
FindClose(handle); 

합니다.

realpath()과 같이 BOOST와 같은 타사 라이브러리를 사용하지 않고이 디렉토리의 절대 경로를 확인할 방법이 있습니까? 각 파일의 절대 경로를 인쇄하고 싶습니다.

+0

[UNC] (http://en.wikipedia.org/wiki/Uniform_Naming_Convention#Uniform_Naming_Convention) 경로를 요청합니까? –

+0

나는 그런 일반적인 해결책이 필요하다고 생각하지 않는다. 로컬 경로는 C : \ bla \ blabla \ etc와 같이 지금은 정상적으로 수행되어야합니다. –

+0

로컬 경로가 있다는 보장이 없습니다. –

답변

9

GetFullPathName 기능을 참조하십시오.

+4

특히, 디렉토리에서'GetFullPathName'을 호출하고'WIN32_FIND_DATA'에있는 파일 이름과 결합하십시오. –

+0

@ RaymondChen, 어떻게 이루어 졌습니까? 내 경우에는 (질문과 유사) 문자열과 같은 와일드 카드가있는 경로가 있지만 발견 된 파일 만 처리합니다. 경로에 와일드 카드가 포함될 수 있으므로 디렉토리가 존재하지 않을 수 있으므로 어떻게 든 찾은 파일의 상위 디렉토리를 가져 와서 해당 디렉토리의 전체 경로를 가져와야합니까? –

+1

@JavierMr 새로운 질문이있는 경우 새로운 질문을 올리십시오. 나는 "디렉토리가 존재하지 않을 수도 있습니다"라는 말의 의미를 모릅니다. 디렉토리는 바로 거기에 있습니다 :'./test/*'에서 디렉토리는'./test'입니다. 와일드 카드는 디렉토리 부분에 허용되지 않으므로 디렉토리를 가져 오면 와일드 카드를 처리 할 필요가 없습니다. –

4

당신은 GetFullPathName

을 시도 할 수 있습니다 또는 당신은 SetCurrentDirectoryGetCurrentDirectory를 사용할 수 있습니다. 나중에 다시 돌아갈 수 있도록하기 전에 현재 디렉토리를 저장하는 것이 좋습니다.

두 경우 모두 검색 디렉토리의 전체 경로 만 가져올 수 있습니다. API 호출이 느립니다. 루프 안에는 문자열 만 결합하면됩니다.