2010-02-12 7 views
9

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); 
    } 
+0

@Johannes, danke, ich habe die Frage behoben. – Ash

+0

Vielleicht möchten Sie auch den Titel der Frage ändern –

+0

@John, ja, fertig. Hinweis zu self: OS! = FS;) – Ash

Antwort

4

Der nächste Link, den ich die Liste der System finden könnten, hier Anrufe von Metasploit ... Ich nehme wurde, einen Stich, aber ich könnte mir vorstellen, dass 'FindFirstFileEx' irgendwie ein indirekter Aufruf des NT-Systemaufrufs sein würde, Äquivalent 'NtOpenDirectoryObject', 'NtQueryDirectoryFile', 'NtQueryDirectoryObject' ... Ich hoffe ... wenn jemand denkt, ich liege falsch und stimme nicht zu, werde ich es tun korrigiert werden, wer auch immer nicht einverstanden ist :)

Allerdings habe ich hier auf ein paar Links getroffen

  • CodeGuru Forum zu diesem Thema über die Flagge
  • Wine hat eine Mailing als die Flagge als keine Wirkung enthalten ist?
  • GenNT erwähnt, dass es anscheinend auf NTFS beschränkt ist, (es gibt 3 Antworten zu diesem Eintrag)
  • Hier auf SO, eine Frage auf: ‚Wie Liste der Ordner in diesem Ordner bekommen‘

bearbeiten : Gerade jetzt nach der Erwähnung in den Kommentaren, ich dachte, es wäre passend genug, um einen Link zu den Linux NTFS driver für die Fähigkeiten zum Lesen der NTFS-Partition hinzuzufügen, gibt es Änderungen der Quellversion, um die verschiedenen NTFS-Versionen zurück zu Win2000 zu empfangen ...

Hope this hilft, Mit freundlichen Grüßen, Tom.

+0

Es ist auch möglich, dass dies davon abhängt, welche _version_ von ntfs Sie verwenden. Ich glaube, es gab einige Änderungen im WinXP-Zeitrahmen. –

+0

@John: Ich würde geneigt sein zuzustimmen, da es NTFS-Änderungen gab (ab Vista in Bezug auf die neue Bootloader-Methode) und auch, XP Home und Professional hatten einen entscheidenden Unterschied in der NTFS - Sicherheit, in Profi, könnten Sie einstellen die Berechtigungen, nicht verfügbar unter Home ... – t0mm13b

+0

Bitte sehen Sie meine bearbeitete Antwort ... :) – t0mm13b

Verwandte Themen