2012-11-14 22 views
16

私はこれを検索しています。ちょうどうまくいかないので脳雲があるかもしれません。ディレクトリがデルファイのジャンクションであるかどうかを検出する

フォルダがジャンクションかどうかを検出して、再帰的なファイル検索が無限ループに逃げないようにする必要があります。

私は、attrがTWin32FindDataからdwFileAttributesある

IsJunction(attr: dword): boolean; 

のような単純な機能を使用することができます。

私はそれを動作させるように思えません。ありがとう!

+3

私は質問をロールバックしました。あなたの編集は質問を完全に変更しました。あなたが聞いた質問はSertacによって巧みに答えられました。次のステップはその答えを受け入れることです。ファインドファンクションを機能させることができない場合は、別の質問の対象となります。一度に1つ質問してください。目標の投稿を移動しないでください。 –

+1

私はそれには反対して、それを別の質問ではなく、何でも見ています。ありがとう。 – Daniel

+7

明らかに異なる質問です。 Sertacはあなたに機能する 'IsJunction'を与えました。誰かがあなたの検索コードのバグ修正に答えたとします。今、あなたは2つの答えのどちらを受け入れるでしょうか?質問には受け入れられる回答が1つしかないため、質問では1つの質問しか聞かれません。少なくとも、それは何千もの質問に答えることからの私のテイクです! ;-) –

答えて

12

dwFileAttributesTWin32FindDataこの情報がない場合は、dwReserved0フィールドを参照する必要があります。 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

'dwFileAttributes'フィールドには' FILE_ATTRIBUTE_REPARSE_POINT'フラグがあります。再解析ポイントタグの値など、実際の再解析ポイント情報にアクセスする場合は、 'dwReserved0'フィールドだけを調べる必要があります。 –

+0

@Remy、はい。私は実際にダビデの答えに同じことをコメントし、彼が後者の機能を追加したときに彼の答えをupvoted。しかし実際には、実際には接合点を特定することを実際に求めているようです。 –

+0

+1非常に良い。私は、あなたが必要とするものすべてが再解析タグであれば、DeviceIoControl呼び出しをスキップできることに気づいていませんでした。これは私よりずっと良い答えです。 –

7

JCL(JEDIコードライブラリ)JclNTFSユニットもお試しください。例えば、
NtfsIsFolderMountPoint/NtfsGetJunctionPointDestinationのように、接合部を処理する方法はいくつかあります。

関連する問題