gpt4 book ai didi

delphi - 更改驱动器分区中所有文件的属性

转载 作者:行者123 更新时间:2023-12-03 19:41:36 24 4
gpt4 key购买 nike

使用 FileSetAttr 可以轻松更改文件的属性.

我想更改位于任何分区上的所有文件的属性(例如“D:”)。
对于我尝试的搜索功能:

procedure FileSearch(const PathName, FileName : string) ;
var
Rec : TSearchRec;
Path : string;
begin
Path := IncludeTrailingPathDelimiter(PathName) ;
if FindFirst (Path + FileName, faAnyFile - faDirectory, Rec) = 0 then
try
repeat
ListBox1.Items.Add(Path + Rec.Name) ;
until FindNext(Rec) <> 0;
finally
FindClose(Rec) ;
end;

但是我怎样才能用它来遍历整个驱动器呢?

最佳答案

您确实需要逐个文件遍历整个驱动器设置属性。您将需要修改代码以递归到子目录。显然,您实际上需要调用设置属性的函数。

基本方法如下所示:

type
TFileAction = reference to procedure(const FileName: string);

procedure WalkDirectory(const Name: string; const Action: TFileAction);
var
F: TSearchRec;
begin
if FindFirst(Name + '\*', faAnyFile, F) = 0 then begin
try
repeat
if (F.Attr and faDirectory <> 0) then begin
if (F.Name <> '.') and (F.Name <> '..') then begin
WalkDirectory(Name + '\' + F.Name, Action);
end;
end else begin
Action(Name + '\' + F.Name);
end;
until FindNext(F) <> 0;
finally
FindClose(F);
end;
end;
end;

我以一种通用的方式编写了此代码,以允许您使用具有不同操作的相同步行代码。如果您要使用此代码,您需要将属性设置代码包装到您作为 Action 传递的过程中。 .如果您不需要概括性,则删除所有提及 TFileAction并将调用替换为 Action使用您的属性设置代码。像这样:
procedure WalkDirectory(const Name: string);
var
F: TSearchRec;
begin
if FindFirst(Name + '\*', faAnyFile, F) = 0 then begin
try
repeat
if (F.Attr and faDirectory <> 0) then begin
if (F.Name <> '.') and (F.Name <> '..') then begin
WalkDirectory(Name + '\' + F.Name);
end;
end else begin
DoSetAttributes(Name + '\' + F.Name);
end;
until FindNext(F) <> 0;
finally
FindClose(F);
end;
end;
end;

当您尝试在整个卷上运行它时,预计这需要相当长的时间。您将希望在仅包含几个文件和几个子目录级别的目录上进行测试。

此外,请为修改某些文件的属性以失败的代码做好准备。您不能指望执行卷范围的操作而不会遇到由于安全问题等原因而导致的失败。使您的代码对此类场景具有健壮性。

关于delphi - 更改驱动器分区中所有文件的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20143132/

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