2017-01-17 1 views
2

Ich versuche FindFirstFile zu überprüfen, um zu verwenden, wenn einige Dateien nach einem Muster existieren, aber es scheint, dass der Platzhalter * nicht für ein Verzeichnis stehen kann.Warum Platzhalter für Verzeichnis in FindFirstFile nicht stehen kann?

int main() 
{ 
    WIN32_FIND_DATAW findFileData; 
    wchar_t path[] = LR"(.\*\*.txt)"; 
    HANDLE hFind = FindFirstFileW(path, &findFileData); 

    if(hFind != INVALID_HANDLE_VALUE) 
    { 
    do 
    { 
     printf("%S\n", findFileData.cFileName); 
    } while (FindNextFileW(hFind, &findFileData)); 
    } 
} 

Mit diesem Baum wird nichts gedruckt:

. 
|- foo 
| |- some.txt 
| 
|- bar 
| |- another.txt 

Warum diese Einschränkung? Gibt es einen Workaround?

+3

Da '* \ * \ *' ist nicht gültigen Verzeichnisnamen. Wenn Sie die Ordnerhierarchie für einige Dateien durchsuchen möchten, müssen Sie einen rekursiven Algorithmus implementieren. – Ari0nhh

Antwort

6

Wildcards sind nur in dem Teil des Dateinamens nach dem letzten Pfadseparator gestattet. Die documentation erklärt dies. Es heißt:

Das Verzeichnis oder der Pfad und der Dateiname. Der Dateiname kann Platzhalterzeichen enthalten, z. B. ein Sternchen (*) oder ein Fragezeichen (?).

Wenn Sie mehrere Verzeichnisse durchsuchen möchten, müssen Sie diese verschachtelte oder rekursive Iteration explizit implementieren.

+0

Ok, danke. Ich habe nicht verstanden, dass es eine formale Unterscheidung zwischen Pfad und Dateiname gibt. Ich laufe unter Debian zu Hause, und AFAIK gibt es keine solche Unterscheidung: In der Shell können Sie einen Platzhalter platzieren, wo immer Sie wollen. – Boiethios

+0

@Boietios können Sie die Wildcards der Shell nicht mit einer Wildcard-Behandlung von Systemaufrufen vergleichen. Das Linux-Äquivalent ('opendir' und' readdir' von dem ich denke) von 'FindFirstFile' macht nicht das, was die Shell tut. –

+0

Ja, 'opendir()' und 'readdir()' sind die Äquivalente von 'Findfirstfile' (genauer gesagt, etwas komplexer erfordert, dass Sie die Pattern-Matching zu tun) ("*. *"), Und ja, sie werden nicht überqueren Verzeichnisgrenzen. Unix libc stellt eine Funktion 'ftw()' zur Verfügung, die einen rekursiven Schritt ausführt; nicht sicher, ob msvcrt das auch tut ... Und selbst dann müsstest du immer noch selbst Muster erstellen. – andlabs

3

Als documentation heißt es:

Der Dateiname kann Platzhalter enthalten, beispielsweise ein Sternchen (*) oder ein Fragezeichen (?).

Also nur der letzte Teil kann einen Platzhalter haben, vorherige Teile müssen explizit sein.

Sie haben die Funktionalität, die Sie in zwei Teilen umsetzen wollen: erste Liste alle Verzeichnisse und dann alle Dateien aus ihnen mit dem Wildcard-Liste.

Verwandte Themen