2012-11-14 13 views
16

Sono stato Google a cercare questo potrei avere delle nuvole cerebrali perché semplicemente non funziona.Rilevare se una directory è una giunzione in Delphi

Devo rilevare se una cartella è una giunzione, quindi la mia ricerca di file ricorsiva non si esaurisce in un ciclo infinito.

ho potuto utilizzare una semplice funzione come

IsJunction(attr: dword): boolean; 

dove attr è dwFileAttributes da TWin32FindData;

Non riesco proprio a farlo funzionare. Grazie!

+3

Ho ricollegato la domanda. La tua modifica ha completamente cambiato la domanda. La domanda che hai chiesto è stata esaudita da Sertac. Il prossimo passo per te è accettare quella risposta. Se non riesci a far funzionare la funzione di ricerca, questa può essere l'argomento di un'altra domanda. Per favore, una domanda alla volta, e non spostare i pali della porta. –

+1

Non sono d'accordo e non lo vedo come una domanda diversa ma qualsiasi altra cosa. Grazie. – Daniel

+7

È ovviamente una domanda diversa. Sertac ti ha dato un funzionamento 'IsJunction'. Supponiamo che qualcuno abbia poi risposto alla risoluzione del bug nel codice di ricerca. Ora, quale delle due risposte accetteresti? Poiché una domanda può avere solo una risposta accettata, ne consegue che le domande possono solo porre una singola domanda. Almeno, questo è il mio modo di rispondere a migliaia di domande !! ;-) –

risposta

12

dwFileAttributes di TWin32FindData non dispone di tale informazione, è necessario cercare il campo dwReserved0. Vedi 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

Il campo 'dwFileAttributes' include il flag' FILE_ATTRIBUTE_REPARSE_POINT' (il documento che hai collegato persino lo dice). È sufficiente guardare il campo 'dwReserved0' se si desidera accedere alle informazioni sul punto di reparse, ad esempio il valore del tag del punto di analisi. –

+0

@Remy, sì. In realtà ho commentato la stessa cosa per la risposta di David e poi ho alzato la sua risposta quando ha aggiunto quest'ultima funzione. Ma la domanda in effetti sembra davvero chiedere di identificare un punto di congiunzione. –

+0

+1 Molto buono. Semplicemente non mi ero reso conto che puoi saltare la chiamata DeviceIoControl se tutto ciò di cui hai bisogno è il tag reparse. Questa è una risposta molto migliore della mia. –

7

Puoi provare anche JCL (Libreria JEDI) JclNTFS unità.
ha alcuni metodi per gestire gli svincoli ad esempio:
NtfsIsFolderMountPoint/NtfsGetJunctionPointDestination.

Problemi correlati