Gewusst wie: auflisten von Dateien in einem Verzeichnis mit dem Windows-API?
Ich habe diesen code und es zeigt Ordner mit dem Verzeichnis selbst, nicht seinen Inhalt. Ich will, um seinen Inhalt anzuzeigen. Ich will nicht von boost::filesystem.
Wie kann ich dies beheben?
Code:
#include <windows.h>
#include <iostream>
int main()
{
WIN32_FIND_DATA data;
HANDLE hFind = FindFirstFile("C:\\semester2", &data); //DIRECTORY
if ( hFind != INVALID_HANDLE_VALUE ) {
do {
std::cout << data.cFileName << std::endl;
} while (FindNextFile(hFind, &data));
FindClose(hFind);
}
}
Ausgabe:
semester2
- Mögliche Duplikate von How to get Current Directory?
- Naja, nicht wirklich, aber es gab mir eine Idee! Jetzt funktioniert ' s! Danke! 🙂
- Seite-Hinweis: Sie sind mit einem schmalen Zeichen-literal mit compile-Zeit ausgewählt Zeichenbreite APIs. Moderne build-Umgebungen neigen dazu, die Standard in Unicode-builds, die dazu führen, diese zu brechen. Würde ich dringend empfehlen entweder die Verwendung explizit Unicode-Typen und APIs überall (add
W
suffixWIN32_FIND_DATA
,FindFirstFile
, &FindNextFile
,L
Präfix-Pfad-literal ersetzenstd::cout
mitstd::wcout
) oder mitTCHAR
s konsequent (add#include <tchar.h>
machen das string-literal_T("C:\\semester2")
, und bedingt aliasstd::tcout
zustd::cout
/std::wcout
als angemessen).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hast du das Verzeichnis denn das ist, was Sie gefragt haben. Wenn Sie möchten, dass die Dateien, um Sie bitten:
(Sie können stattdessen
*.*
wenn Sie es vorziehen, aber anscheinend funktioniert das nur, weil eine rückwärts-Kompatibilität hack so soll wahrscheinlich vermieden werden. Siehe comments und RbMm Antwort.).
und einen link zur übergeordneten..
, wenn Sie nicht wollen, um diese es ist leicht zu überspringen.if
- Anweisung.*.*
ist nur ein Rückschritt zu DOS. Es ist klarer in meiner Ansicht zu verwenden*
statt.Lassen Sie mich einige Anmerkungen über
"*.*"
vs"*"
. Diese Speichergeräte sind nicht gleich.2 unterschiedliche Dateien in unserem Ordner:
somefile
undsomefile.
.Wenn wir verwendet die low-level-api
ZwQueryDirectoryFile
mit"*.*"
als Suchbegriff ein (dies ist die 10 parameter -FileName [in, optional]
) - wir würdensomefile.
nur. Aber wenn wir"*"
würden wir bekommen beide Dateien -somefile
undsomefile.
Wenn wir versuchen
FindFirstFile("C:\\semester2\\*.*", &data);
können wir feststellen, als in den beiden Dateiensomefile
undsomefile.
zurückgegeben werden. So, hier"*.*"
vs"*"
haben den gleichen Effekt - kein Unterschied in der Nutzung.Warum geschieht dies? Denn im
FindFirstFileEx
imkernelbase
(kernel32
) spezielle check für"*.*"
Maske, und wenn es wahr ist - ersetzen""
(Eine leere Namen, welche die gleiche Wirkung haben wie"*"
).Ich denke, das wird gemacht, um fix ein sehr häufiger Fehler, wenn Benutzer übergeben
"*.*"
anstelle des richtigen"*"
und für rückwärts-Kompatibilität mit legacy-code.Dies ist nicht wahr.
FAT
-style-file-system, das wirklich ist, gespeicherte FETT als Verzeichnis-2 erste Eintrag.NTFS
es gibt keine solche Einträge, aberNTFS.sys
künstlich fügen Sie diese 2 Einträge, wenn Sie in der Maske.So geschieht dies nicht im Win32-API-Ebene, aber in der kernel - auf Treiber-Ebene.
Abschließend
"*.*"
wird korrekt mit Win32-API, wie minimum - aber der richtige und saubere Weg zu"*"
hier."*.*"
werden Fehler mitZwQueryDirectoryFile
api.*.*
zu unterstützen, ist eine Abwärtskompatibilität feature, kurze Dateinamen hatte immer Erweiterungen. (Die extension kann leer sein, aber es war da.) Du hast Recht über den dot und double-dot als Teil der kernel eher als Win32, hatte ich beobachtet, dass die langen Wege, die Sie verwendet hat nicht funktioniert an der Kommandozeile (z.B. tab-Vervollständigung funktioniert nicht), aber schaut man genauer hin, scheint zu sein, etwas zu tun mit der Art und Weisecmd.exe
funktioniert. Einen langen Pfad mit einem Punkt funktioniert, wenn übergeben notepad, zum Beispiel.FindFirstFileEx
und beachten Sie, dass es spezielle check für"*.*"
an und fixieren Sie dieses auf""
- also schneller, alle für die rückwärts-Kompatibilität zu hacken. ich jedoch war nicht vertraut mit diesem vor, weil immer nurZwQueryDirectoryFile
im eigenen code, und hier"*.*"
nicht zurück Dateien wiesomefile
(aber zurücksomefile.
)"*.*"
. über NT-api, habe ich eine andere Meinung (ich denke, es ist richtig, dass es nicht solche hacks), wie ich es für direkte return-Fehler-code (bei nicht konvertieren, es mit dem Verlust der Genauigkeit), strenge uniformierte Signaturen (Vergleiche win32), viel mehr power und effektiv vergleichen win32, für die Möglichkeit, welche nicht vorhanden sind im win32.. aber das ist alles schon off-topic hier. ich habe nicht der Rat zu anybode verwenden 🙂Harrys Antwort wird tatsächlich Ertrag Dateien und Ordner mit einer Erweiterung in den gewünschten Ordner
"C:\\semester2"
.So zum Beispiel, wenn Sie einen Ordner mit dem Namen
"C:\\semester2\\math.course"
wird es auch gefunden werden, indem das obige Beispiel. Außerdem, wenn Sie haben eine Datei namens"C:\\semester2\\math_scores"
(bemerken es nicht, dass eine Verlängerung) wird es nicht gefunden werden.Unter den oben in Betracht, würde ich vorschlagen, die folgende Lösung:
Dieser Liste wird die gesamte Liste der Elemente unter das Verzeichnis.
Filtern Sie die Verzeichnisse, die getan werden können in der folgenden Weise:
Den folgenden verwendet werden kann für Referenzen: FileAttributes Konstanten, FIND_DATA struct, FindFirstFile API
*.*
finden von Dateien ohne Erweiterungen. Sehen RbMm-Antwort für weitere Details.