2012-09-11 189 views
6

我使用的是這樣的: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); 

它打印在相對目錄./test/*每個文件的名稱。

有沒有什麼辦法可以確定這個目錄的絕對路徑,就像realpath()在Linux上沒有任何第三方庫如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調用很慢。在循環內部,您只需組合字符串。