2012-09-11 13 views
6

ich so etwas wie dieses bin mit:WIN32_FIND_DATA - Holen Sie sich den absoluten Pfad

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

die die Namen der einzelnen Dateien im relativen Verzeichnis ./test/* druckt.

Gibt es eine Möglichkeit, den absoluten Pfad dieses Verzeichnisses zu ermitteln, so wie es unter Linux tut, ohne Bibliotheken von Drittanbietern wie BOOST einzubeziehen? Ich möchte den absoluten Pfad zu jeder Datei drucken.

+0

Fragen Sie nach einem [UNC] (http://en.wikipedia.org/wiki/Uniform_Naming_Convention#Uniform_Naming_Convention) Pfad? –

+0

Ich glaube nicht, dass ich eine solche allgemeine Lösung brauche. Der lokale Pfad sollte jetzt gut funktionieren (wie in C: \ bla \ blabla \ etc). –

+0

Es gibt keine Garantie, dass es einen lokalen Pfad gibt. –

Antwort

9

Siehe GetFullPathName Funktion.

+4

Rufen Sie speziell 'GetFullPathName' im Verzeichnis auf und kombinieren Sie es mit dem Dateinamen in' WIN32_FIND_DATA'. –

+0

@ RaymondChen, und wie ist das gemacht? In meinem Fall (ähnlich der Frage) habe ich einen Pfad mit Platzhaltern als String, aber ich habe nur Handles für die gefundenen Dateien. Da der Pfad Platzhalter enthalten kann, existiert ein Verzeichnis möglicherweise nicht, also muss ich irgendwie das übergeordnete Verzeichnis der gefundenen Datei holen und dann den vollständigen Pfad für dieses Verzeichnis bekommen? –

+1

@JavierMr Wenn Sie eine neue Frage haben, bitte posten Sie eine neue Frage. Ich weiß nicht, was Sie mit "ein Verzeichnis darf nicht existieren" meinen. Das Verzeichnis befindet sich genau dort: In './Test/*' ist das Verzeichnis './Test'. Wildcards sind im Verzeichnisteil nicht erlaubt. Um das Verzeichnis zu erhalten, müssen Sie keine Platzhalter verwenden. –

4

können Sie GetFullPathName

versuchen Oder können Sie SetCurrentDirectory und GetCurrentDirectory verwenden. Vielleicht möchten Sie das aktuelle Verzeichnis speichern, bevor Sie das tun, damit Sie später wieder darauf zugreifen können.

In beiden Fällen müssen Sie nur den vollständigen Pfad Ihres Suchverzeichnisses abrufen. API-Aufrufe sind langsam. Innerhalb der Schleife kombinieren Sie nur Strings.

Verwandte Themen