Ich verwende die Windows-API-Funktion FindFirstFileEx, weil es die Möglichkeit bietet, nur die Unterverzeichnisse eines bestimmten Verzeichnisses zurückzugeben (Dateien zu ignorieren). Wenn ich diese Funktion jedoch mit dem erforderlichen Flag aufrufen, erhalte ich immer noch sowohl Dateien als auch Verzeichnisse.Dateisystemunterstützung für FindFirstFileEx, Begrenzung auf Verzeichnisse
Die MSDN-Dokumentation für das Flag FindExSearchLimitToDirectories von FindFirstFileEx verwendet sagt:
Dieses eine beratende Flagge ist. Wenn die Datei System die Verzeichnisfilterung unterstützt, sucht die Funktion nach einer Datei, die mit dem angegebenen Namen übereinstimmt und ist auch ein Verzeichnis. Wenn das Dateisystem die Verzeichnisfilterung nicht unterstützt, wird dieses Flag automatisch ignoriert.
Der lpSearchFilter-Parameter der FindFirstFileEx-Funktion muss NULL sein, wenn dieser Suchwert verwendet wird.
Wenn Verzeichnis Filterung erwünscht ist, dieser Flag kann auf alle Datei Systeme verwendet werden, sondern weil es eine beratende Flagge ist und wirkt mich nur auf Dateisysteme , die es unterstützt, muss die Anwendung untersucht die Datei gespeicherten Daten Attribut im LpFindFileData -Parameter der FindFirstFileEx-Funktion, um zu ermitteln, ob die Funktion einen Handle an ein Verzeichnis zurückgegeben hat.
Also, welche Dateisysteme unterstützen dieses Flag? Es wäre vernünftig gewesen, diese unterstützten Dateisysteme auf der gleichen Seite aufzulisten, aber ich kann sie nicht finden.
Mein Entwicklungssystem ist Windows XP SP3, NTFS, .NET 3.5.
Ich weiß, dass ich Dateiattribute überprüfen kann, um zu bestimmen, ob eine Datei ein Verzeichnis ist, dies bedeutet jedoch, jede Datei/jedes Verzeichnis zu überprüfen. Es vereitelt auch den Zweck der Verwendung von FindFirstFileEx an erster Stelle.
Natürlich gibt es immer noch die Chance, dass ich etwas falsch in meinem Code mache. Das einzige, was ich sehen kann, ist das Übergeben von IntPtr.Zero an lpSearchFilter ist möglicherweise nicht dasselbe wie das Übergeben von NULL (wie im Zitat erwähnt).
Hier ist ein Beispiel für den Code Ich verwende:
m_searchDirHandle = WinAPI.FindFirstFileEx(@"C:\Temp\*",
WinAPI.FINDEX_INFO_LEVELS.FindExInfoStandard ,
ref m_findDirData, WinAPI.FINDEX_SEARCH_OPS.FindExSearchLimitToDirectories,
IntPtr.Zero , 0);
if (m_searchDirHandle != WinAPI.INVALID_HANDLE_VALUE)
{
do
{
foundNextDir = WinAPI.FindNextFile(m_searchDirHandle, ref m_findDirData);
} while (foundNextDir);
}
@Johannes, danke, ich habe die Frage behoben. – Ash
Vielleicht möchten Sie auch den Titel der Frage ändern –
@John, ja, fertig. Hinweis zu self: OS! = FS;) – Ash