2009-03-14 15 views
2

Ich verwende den Standard FindFirst und FindNext, um alle Dateien in einem Verzeichnis abzurufen, aber ich brauche die Ergebnisse sortiert zurück (in der gleichen Reihenfolge, dass Klicken auf die Spalte Name im Explorer würde sortiere sie im Grunde) Wie kann ich diese achive Dies muss getan werden, über Win32 DankWie bekomme ich FindFirstFile, um Dateien zu sortieren

Antwort

8

Sie können die Indexing Service dafür verwenden, aber ich würde empfehlen, nur die Sortierung selbst während der Verwendung von FindFirstFile zu behandeln.

Sortierung ist mit der Win32-API von FindFirstFile nicht möglich. Es gibt einen etwas fortgeschritteneren FindFirstFileEx, aber selbst das erlaubt keine Sortierung.

Es gibt ein Raymond Chen post on The Old New Thing about FindFirstFile's limitations.

Ihre beste Wette ist wahrscheinlich, alle Ergebnisse in einen Vektor zu laden und dann zu sortieren.

2

Sie müssen alle Dateinamen in eine geeignete Sammlung lesen und sie dann selbst sortieren. Die Windows-API bietet keine Sortierfunktionen.

0

Win32

Zuerst verwenden und Findfirst Findnext alle Dateien zu finden (denken Sie daran, Findfirst und Findnext Unterstützung glob'ing (* .exe, usw.) ... Legen Sie die passenden Dateien in einer Liste und sortieren es . Die STL werden Sie dort helfen.

Linux

Verwenden opendir() und readdir(), um alle Dateien in einem Verzeichnis zu finden. fnmatch() auf diese Dateien Verwenden Sie Ihre glob'ing zu tun. und wie Windows, laden Sie die passenden Dateien in eine Liste und sortieren Sie sie

+0

Unter Linux können Sie Scandir für einfache Sortierungen verwenden. – istudy0

4

Wie alle darauf hingewiesen haben, kann und kann FindFirstFile() die Dateien, die zurückgegeben werden, nicht sortieren. Es arbeitet auf einer ziemlich niedrigen Ebene und gibt Dateien in einer Reihenfolge zurück, die sich auf die natürliche Reihenfolge der Verzeichniseinträge in einem Verzeichnis bezieht.

Auf einer Festplatte, die mit FAT und FAT32 formatiert ist, hängt diese Reihenfolge stark von der Reihenfolge ab, in der die Dateien erstellt wurden, modifiziert durch Löschen von Dateien und die mögliche Wiederverwendung von leeren Verzeichniseinträgen. Dies liegt daran, dass FAT-Verzeichnisse (wie bei vielen Unix-Dateisystemen) einfach ein gepacktes Array von Verzeichniseintragsstrukturen fester Größe sind, zusammen mit einem hässlichen Hack, um lange in Unicode geschriebene Dateinamen in eine Verzeichnisstruktur für in ASCII geschriebene 8.3-Namen einzupassen. Im Gegensatz zu Unix sind Win32-API-Aufrufe erforderlich, um die Verzeichniseinträge zu lesen. Dies hat jedoch keinen Einfluss auf die Reihenfolge, in der die Einträge gelesen werden.

Auf NTFS (wie ich es verstehe) Verzeichnisse sind in einigen Varianten eines B-Baumes vertreten und die natürliche Reihenfolge der Dateien von der Win32-API ist daher mit der Indizierung natürlich zu dieser Datenstruktur verbunden.

Sie können die Unterschiede mit dem Befehl DIR an der Eingabeaufforderung sehen. Auf einem FAT32-Volume zeigt DIR die Dateien in einer anderen Reihenfolge als wenn derselbe Ordner auf ein NTFS-Volume kopiert wird. DIR /ON sollte Dateien in derselben Reihenfolge auflisten, unabhängig vom zugrunde liegenden Dateisystem.

Keine unsortierte Reihenfolge, die von DIR erzeugt wird, entspricht der Reihenfolge, die von Windows Explorer beim Sortieren nach Name erstellt wird. (In der Tat ist DIR /ON auch nicht dasselbe.)

Windows Explorer verwendet eine case-unabhängige Sortierung, die auch einige Interpunktionszeichen in der Sortierung zu ignorieren scheint und versucht, mit Zahlen umzugehen. Insbesondere wird eine einfache Verwendung von qsort() mit stricmp() nicht die gleiche Antwort wie Explorer erhalten. Es ist nicht klar, ob die tatsächliche Sortierreihenfolge, die entweder von Explorer oder DIR verwendet wird, überall dokumentiert ist.

Zum Beispiel können die folgenden Namen wie dies in DIR sortieren:

C:\temp\test> dir/on/b 
aoli.txt 
a-one.txt 
atwo.txt 
b1.txt 
b10.txt 
b2.txt 
b-20.txt 
b21.txt 
b3.txt 
b-4.txt 

aber aus dem Explorer in der Spalte Name sortiert transkribieren sie in dieser Reihenfolge sind:

aoli.txt 
a-one.txt 
atwo.txt 
b1.txt 
b2.txt 
b3.txt 
b10.txt 
b21.txt 
b-4.txt 
b-20.txt 

ich Probleme, bin sich vorstellen, das Einfache in einer Vergleichsfunktion anzuwenden, um den letzteren Effekt zu erhalten.

3

Sie einfach die Dateinamen sortieren, indem sie in std :: Platzierung gesetzt wie folgt aus:

std::string FileName; 
std::set<string> ListOfFileNames; 

WIN32_FIND_DATAA findFileData; 
HANDLE MyHandle = FindFirstFileA("*.*",&findFileData); 

if(MyHandle != INVALID_HANDLE_VALUE) 
{ 
    FileName = findFileData.cFileName; 
    ListOfFileNames.insert(FileName); 

    while(FindNextFileA(MyHandle,&findFileData) != 0) 
    { 
     FileName = findFileData.cFileName; 
     ListOfFileNames.insert(buffer); 
    } 
} 

FindClose(MyHandle); 

// Output the list of names found 
for(std::set<string>::iterator Name = ListOfFileNames.begin() ; Name != ListOfFileNames.end() ; ++Name) 
{ 
    cout << *Name << endl; 
} 
+0

Woher kommt die Variable "Puffer"? – matthieu

0

In Linux verwendet scandir() Funktion, wenn der dritte Parameter der Anruf AlphaSort() oder versionsort().

+0

Die Frage ist über Win32 ... –

Verwandte Themen