2012-11-14 20 views
16

Przeszukałem Google, może mam pewne chmury mózgu, ponieważ to po prostu nie działa.Wykrywanie, czy katalog jest węzłem w Delphi

Potrzebuję wykryć, czy folder jest skrzyżowaniem, więc moje rekurencyjne wyszukiwanie plików nie działa w nieskończonej pętli.

można używać proste funkcję jak

IsJunction(attr: dword): boolean; 

gdzie atr jest dwFileAttributes z TWin32FindData;

Po prostu nie mogę tego zmusić do działania. Dzięki!

+3

Wycofałem pytanie. Twoja zmiana całkowicie zmieniła pytanie. Pytanie, które zadałeś, zostało fachowo udzielone przez Sertac. Następnym krokiem dla ciebie jest zaakceptowanie tej odpowiedzi. Jeśli nie możesz sprawić, aby funkcja wyszukiwania działała, może to być przedmiotem innego pytania. Zadaj jedno pytanie naraz i nie przesuwaj postów. –

+1

Nie zgadzam się i nie widzę tego jako innego pytania, ale cokolwiek innego. Dzięki. – Daniel

+7

To oczywiście inne pytanie. Sertac dał ci funkcjonujący "IsJunction". Załóżmy, że ktoś odpowiedział na naprawienie błędu w kodzie wyszukiwania. Teraz, która z dwóch odpowiedzi byś zaakceptowała? Ponieważ pytanie może mieć tylko jedną akceptowaną odpowiedź, oznacza to, że pytania mogą zadawać tylko jedno pytanie. Przynajmniej to jest mój wniosek, że odpowiedziałem na tysiące pytań !! ;-) –

Odpowiedz

12

dwFileAttributes z TWin32FindData nie ma tych informacji, musisz spojrzeć na pole dwReserved0. Zobacz 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

Pole 'dwFileAttributes' zawiera flagę' FILE_ATTRIBUTE_REPARSE_POINT' (dokument, z którym się łączysz, nawet mówi). Wystarczy spojrzeć na pole 'dwReserved0', jeśli chcesz uzyskać dostęp do informacji o rzeczywistym punkcie ponownej analizy, takich jak wartość tagu punktu ponownej analizy. –

+0

@Remy, tak. Naprawdę skomentowałem to samo w odpowiedzi Davida, a następnie wznowiłem jego odpowiedź, kiedy dodał tę drugą funkcję. Wydaje się jednak, że rzeczywiście pytanie to dotyczy identyfikacji punktu połączenia. –

+0

+1 Bardzo dobrze. Po prostu nie zdawałem sobie sprawy, że możesz pominąć wywołanie DeviceIoControl, jeśli potrzebujesz tylko tagu ponownej analizy. To jest o wiele lepsza odpowiedź niż moja. –

7

Możesz także wypróbować jednostkę JCL (JEDI Code Library) JclNTFS.
ma kilka metod radzenia sobie z łączeniami, np .:
NtfsIsFolderMountPoint/NtfsGetJunctionPointDestination.

Powiązane problemy