gpt4 book ai didi

delphi - 如何阻止 TJvSearchFiles 递归连接?

转载 作者:行者123 更新时间:2023-12-03 18:23:34 29 4
gpt4 key购买 nike

我正在使用这个 JEDI 组件来枚举文件,但我无法让它跳过连接点。我可以对代码进行设置或修改来解决这个问题吗?

我不是 100% 确定 jvsearchfiles.pas 单元中的相关代码。但我认为它在这里:

function TJvSearchFiles.EnumFiles(const ADirectoryName: string;
Dirs: TStrings; const Search: Boolean): Boolean;
var
Handle: THandle;
Finished: Boolean;
DirOK: Boolean;
begin
DoBeginScanDir(ADirectoryName);

{ Always scan the full directory - ie use * as mask - this seems faster
then first using a mask, and then scanning the directory for subdirs }
Handle := FindFirstFile(PChar(ADirectoryName + '*'), FFindData);
Result := Handle <> INVALID_HANDLE_VALUE;
if not Result then
begin
Result := GetLastError in [ERROR_FILE_NOT_FOUND, ERROR_ACCESS_DENIED];;
Exit;
end;

Finished := False;
try
while not Finished do
begin
// (p3) no need to bring in the Forms unit for this:
if not IsConsole then
DoProgress;
{ After DoProgress, the user can have called Abort,
so check it }
if FAborting then
begin
Result := False;
Exit;
end;

with FFindData do
{ Is it a directory? }
if (dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY > 0) then
begin
{ Filter out '.' and '..'
Other dir names can't begin with a '.' }

{ | Event | AddDir | SearchInDir
-----------------------------------------------------------------
doExcludeSubDirs |
True | Y N N
False | N N N
doIncludeSubDirs |
True | Y Y Y
False | N Y Y
doExcludeInvalidDirs |
True | Y Y Y
False | N Y N
doExcludeCompleteInvalidDirs |
True | Y Y Y
False | N N N
}
if not IsDotOrDotDot(cFileName) and
((soIncludeSystemHiddenDirs in Options) or not IsSystemAndHidden(FFindData)) then
{ Use case to prevent unnecessary calls to DoCheckDir }
case DirOption of
doExcludeSubDirs, doIncludeSubDirs:
begin
if Search and (soSearchDirs in Options) and DoCheckDir then
DoFindDir(ADirectoryName);
if DirOption = doIncludeSubDirs then
Dirs.AddObject(cFileName, TObject(True))
end;
doExcludeInvalidDirs, doExcludeCompleteInvalidDirs:
begin
DirOK := DoCheckDir;
if Search and (soSearchDirs in Options) and DirOK then
DoFindDir(ADirectoryName);

if (DirOption = doExcludeInvalidDirs) or DirOK then
Dirs.AddObject(cFileName, TObject(DirOK));
end;
end;
end
else
if Search and (soSearchFiles in Options) and DoCheckFile then
DoFindFile(ADirectoryName);

if not FindNextFile(Handle, FFindData) then
begin
Finished := True;
Result := GetLastError = ERROR_NO_MORE_FILES;
end;
end;
finally
Result := FindClose(Handle) and Result;
end;
end;

这是上一个问题中给出的功能,但我一直无法让它工作。
function IsJunction(const FileName: string): Boolean;
const
IO_REPARSE_TAG_MOUNT_POINT = $0A0000003;
var
FindHandle: THandle;
FindData: TWin32FindData;
begin
Result := False;
FindHandle := FindFirstFile(PChar(FileName), FindData);
if FindHandle <> INVALID_HANDLE_VALUE then begin
Result := ((FindData.dwFileAttributes and FILE_ATTRIBUTE_REPARSE_POINT)
= FILE_ATTRIBUTE_REPARSE_POINT) and
((FindData.dwReserved0 and IO_REPARSE_TAG_MOUNT_POINT)
= IO_REPARSE_TAG_MOUNT_POINT);
winapi.windows.FindClose(FindHandle);
end else
RaiseLastOSError;
end;

最佳答案

您正在查看的函数已经有一个跳过目录的点:

if not IsDotOrDotDot(cFileName) and
((soIncludeSystemHiddenDirs in Options) or not IsSystemAndHidden(FFindData)) then

所以你可以简单地扩展这个条件。但是,我不会通过添加另一个 and 来扩展它。条款。我个人找 if像这样的陈述是非常不透明的。我将引入一个解释变量:
var
SkipDirectory: Boolean;

然后像这样分配它:
if IsDotOrDotDot(cFileName) then
SkipDirectory := True
else if IsSystemAndHidden(FFindData) and not (soIncludeSystemHiddenDirs in Options) then
SkipDirectory := True
else if IsJunction(FFindData) then
SkipDirectory := True
else
SkipDirectory := False;

if not SkipDirectory then
....

然后你需要重新处理你的 IsJunction收到 TWin32FindData参数:
function IsJunction(const FindData: TWin32FindData): Boolean;
const
IO_REPARSE_TAG_MOUNT_POINT = $0A0000003;
begin
Result := ((FindData.dwFileAttributes and FILE_ATTRIBUTE_REPARSE_POINT)
= FILE_ATTRIBUTE_REPARSE_POINT) and
(FindData.dwReserved0 = IO_REPARSE_TAG_MOUNT_POINT);
end;

尽管我可能会重新编写@Sertac 的 if 语句以将其分解得更多一些。但这也许只是我个人的喜好。
function FlagIsSet(Flags, Flag: DWORD): Boolean;
begin
Result := (Flags and Flag)<>0;
end;

function IsJunction(const FindData: TWin32FindData): Boolean;
const
IO_REPARSE_TAG_MOUNT_POINT = $0A0000003;
begin
Result := FlagIsSet(FindData.dwFileAttributes, FILE_ATTRIBUTE_REPARSE_POINT)
and (FindData.dwReserved0=IO_REPARSE_TAG_MOUNT_POINT);
end;

关于delphi - 如何阻止 TJvSearchFiles 递归连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13432916/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com