2012-11-14 4 views
16

Ich habe Google gesucht, ich habe vielleicht einige Gehirnwolken, weil es einfach nicht funktioniert.Erkennen, ob ein Verzeichnis eine Verzweigung in Delphi ist

Ich muss erkennen, ob ein Ordner eine Junction ist, so dass meine rekursive Dateisuche nicht in eine Endlosschleife abläuft.

konnte ich eine einfache Funktion wie

IsJunction(attr: dword): boolean; 

verwenden, wo attr dwFileAttributes von TWin32FindData ist;

Ich kann es einfach nicht funktionieren. Vielen Dank!

+3

Ich Rollback die Frage. Ihre Änderung hat die Frage vollständig geändert. Die Frage, die Sie gestellt haben, wurde von Sertac fachkundig beantwortet. Der nächste Schritt für Sie ist, diese Antwort zu akzeptieren. Wenn Sie Ihre Suchfunktion nicht funktionieren lassen, kann das eine andere Frage sein. Bitte, eine Frage nach der anderen, und verschiebe die Torpfosten nicht. –

+1

Ich stimme nicht zu und sehe es nicht als eine andere Frage, aber was auch immer. Vielen Dank. – Daniel

+7

Es ist offensichtlich eine andere Frage. Sertac gab dir eine funktionierende "IsJunktion". Angenommen, jemand hätte dann den Fehler in Ihrem Suchcode behoben. Nun, welche der beiden Antworten würdest du akzeptieren? Da eine Frage nur eine akzeptierte Antwort haben kann, folgt, dass Fragen nur eine einzige Frage stellen können. Zumindest ist das meine Antwort, nachdem ich tausende Fragen beantwortet habe !! ;-) –

Antwort

12

dwFileAttributes von TWin32FindData nicht diese Informationen haben, müssen Sie auf die dwReserved0 Feld schauen. Siehe documentation.

function IsJunction(const FileName: string): Boolean; 
// IO_REPARSE_TAG_MOUNT_POINT = $A0000003; 
var 
    FindHandle: THandle; 
    FindData: TWin32FindData; 
begin 
    Result := False; 
    FindHandle := FindFirstFile(PChar(FileName), FindData); 
    if FindHandle <> INVALID_HANDLE_VALUE then begin 
    Result := (Bool(FindData.dwFileAttributes and FILE_ATTRIBUTE_REPARSE_POINT)) 
       and Bool(FindData.dwReserved0 and $80000000) // MS bit 
       and Bool(FindData.dwReserved0 and $20000000) // name surrogate bit 
       and (LoWord(FindData.dwReserved0) = 3); // mount point value 
    winapi.windows.FindClose(FindHandle); 
    end else 
    RaiseLastOSError; 
end; 
+0

Das Feld 'dwFileAttributes' enthält das Flag' FILE_ATTRIBUTE_REPARSE_POINT' (das Dokument, mit dem Sie verbunden sind, sagt das sogar). Sie müssen nur das Feld "dwReserved0" anzeigen, wenn Sie auf die Informationen des tatsächlichen Analysepunkts zugreifen möchten, z. B. den Wert des Analysepunkt-Tags. –

+0

@Remy, ja. Ich habe das Gleiche zu Davids Antwort kommentiert und dann seine Antwort verbessert, als er die letztere Funktion hinzufügte. In der Tat scheint die Frage tatsächlich darin zu bestehen, einen Knotenpunkt zu identifizieren. –

+0

+1 Sehr gut. Ich hatte einfach nicht bemerkt, dass Sie den Aufruf von DeviceIoControl überspringen können, wenn Sie nur das Reparse-Tag benötigen. Das ist eine viel bessere Antwort als meine. –

7

Sie können auch JCL (JEDI Code Library) JclNTFS Einheit versuchen.
es hat ein paar Methoden, um mit Übergängen zu behandeln, z. B .:
NtfsIsFolderMountPoint/NtfsGetJunctionPointDestination.

Verwandte Themen