gpt4 book ai didi

Delphi,FindNext 即使有文件夹也返回错误 18

转载 作者:行者123 更新时间:2023-12-03 15:22:27 28 4
gpt4 key购买 nike

来自冰岛的问候!

首先,我用谷歌和这里都进行了搜索,但没有结果。

我正在使用 Delphi 进行写作,并且拥有几年的 Delphi 经验(在 Pascal 方面拥有超过 30 年的经验)

这些年来我构建了各种文件实用程序,并在几乎每个此类应用程序中使用了 FindFirst 和 FindNext 功能。今天我正在使用我编写的旧文件实用程序,发现它不能 100% 工作

一切正常,直到目录名称变得有些奇怪,即名称内部有几个句点。故事是我正在安装 Wamp,其中的一些文件夹是用这种奇怪的方法命名的。

As: "c:\wamp\apps\phpmyadmin3.4.5"
"c:\wamp\apps\sqlbuddy1.3.3"
"c:\wamp\apps\webgrind1.0 etc"

当我进行调试时,我发现 Findnext 只是返回错误 18,这与 FindNext 在没有更多文件可查找时返回的错误相同。

我尝试过 FindFirstFile 和 FindNextFile ,结果相同。我正在考虑尝试 API FindNextFileEx,如果这与长文件名有关,但不是那么乐观..

此外,我注意到这些文件夹中的属性不是 16 (hex10),而是 8208 (8192+16),但它与此问题没有任何关系,因为我可以例如屏蔽(AND)带有 $00FF 等的 attr

PROCEDURE TForm_Leit.Finna_Dir (Str_InnDir : STRING);
VAR
S_Rec1 : TSearchRec;
Bo_Buid : BOOLEAN;
BEGIN
.
.
.
//Find Dir part
IF (FindFirst (Str_Inndir+'\*.', faDirectory, S_Rec1) = 0) THEN
REPEAT
Bo_Buid := FALSE;
IF ((S_Rec1.Name = '.') OR (S_Rec1.Name = '..')) THEN
REPEAT
Bo_Buid := FindNext (S_Rec1) <> 0;
UNTIL NOT((S_Rec1.Name = '.') OR (S_Rec1.Name = '..')) OR (Bo_BUid);

IF NOT(Bo_Buid) THEN
Finna_Dir (Str_Inndir+'\'+S_Rec1.Name); //Recursion

UNTIL (FindNext (S_Rec1) <> 0);
END;

最佳答案

您使用的模式 ('\*.') 仅与不带句点的文件和目录名称匹配(这也意味着文件没有扩展名)。尝试使用:

IF (FindFirst (Str_Inndir+'\*', ...


详细说明一下,VCL 的“Find..”函数是底层 API 的“Find..”函数的包装器,它并不真正关心您是否要搜索文件或文件夹(“Attr”)您可以传递给 sysutils.FindFirst 的参数是 VCL 提供的功能,VCL 只能通过过滤来影响搜索结果。因此,对于文件或文件夹来说,使用“*.”模式的结果不会有所不同。如果该模式无法返回包含句点的文件名,那么它也无法返回包含句点的文件夹。

该参数的用法与dir命令相同。从命令提示符导航到“..\apps”文件夹,如果您发出>dir *.,您将不会看到列出的问题中的文件夹。

您可以查看并尝试以下示例代码中的不同“模式”,该代码仅使用 API 枚举文件,以了解不同的通配符如何影响搜索结果。

var
Data: TWIN32FindData;

procedure ListFiles(const Path, Pattern: string; List: TStrings);

function IsDot: Boolean;
begin
Result := (string(Data.cFileName) = '.') or (Data.cFileName = '..');
end;

function IsDirectory: Boolean;
begin
Result := Bool(Data.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY);
end;

procedure PutFileName;
begin
if not IsDot then begin
if IsDirectory then
List.Add(Path + '\' + Data.cFileName + ' <dir>')
else
List.Add(Path + '\' + Data.cFileName); //'
end;
end;

var
FindHandle: THandle;
begin
FindHandle := FindFirstFile(PChar(Path + Pattern), Data);
if FindHandle <> INVALID_HANDLE_VALUE then
try
PutFileName;

while FindNextFile(FindHandle, Data) do begin
PutFileName;
if (not IsDot) and IsDirectory then
ListFiles(Path + '\' + Data.cFileName, Pattern, List); //'
end;

finally
windows.FindClose(FindHandle);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
Pattern = '\*';
begin
Memo1.Clear;
ListFiles('..sometestdirectory..', Pattern, Memo1.Lines);
end;

关于Delphi,FindNext 即使有文件夹也返回错误 18,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10275469/

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