2012-09-11 19 views
6

alın: göreli dizinde ./test/* her dosya adlarını yazdırırWIN32_FIND_DATA - Böyle bir şey kullanıyorum mutlak yolunu

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); 

.

Bu dizinin mutlak yolunu belirlemenin herhangi bir yolu var mı, tıpkı realpath() gibi Linux'ta BOOST gibi herhangi bir üçüncü taraf kitaplığı içermiyor mu? Her dosyaya mutlak yol yazdırmak istiyorum.

+0

[UNC] (http://en.wikipedia.org/wiki/Uniform_Naming_Convention#Uniform_Naming_Convention) yolu mu istiyorsunuz? –

+0

Bence böyle genel bir çözüme ihtiyacım var. Yerel yol şu an için iyi olmalıdır (C: \ bla \ blabla \ etc'de olduğu gibi). –

+0

Yerel bir yolun garantisi yoktur. –

cevap

9

GetFullPathName işlevine bakın.

+4

Özellikle, dizinde 'GetFullPathName' öğesini çağırın ve 'WIN32_FIND_DATA' dosyasındaki dosya adıyla birleştirin. –

+0

@RaymondChen, ve bu nasıl yapılır? Benim durumumda (soruya benzer şekilde) joker karakterlerle bir dize olarak bir yolum var, ancak sadece bulunan dosyalar için tutamaçlarım var. Yol joker karakterler içerebileceğinden, bir dizin mevcut olmayabilir, bu yüzden bir şekilde bulunan dosyanın üst dizinini almam ve ardından bu yön için tam yolu almam gerekir. –

+1

@JavierMr Yeni bir sorunuz varsa, lütfen yeni bir soru gönderin. "Bir dizin olmayabilir" ile ne demek istediğini bilmiyorum. Dizin orada: '/ test/*' de dizin './Test' dir. Dizin bölümünde joker karakterlere izin verilmez, bu yüzden dizinin alınması joker karakterlerle uğraşmanızı gerektirmez. –

4

Sen GetFullPathName

deneyebilirsiniz Yoksa SetCurrentDirectory ve GetCurrentDirectory kullanabilirsiniz. Bunu yapmadan önce geçerli dizini kaydetmek isteyebilirsiniz, böylece daha sonra buna geri dönebilirsiniz. Her iki durumda da, yalnızca arama dizininizin tam yolunu bulmanız yeterlidir. API çağrıları yavaş. Döngünün içinde sadece dizeleri birleştirirsiniz.

İlgili konular