使用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;
但是如何使用它来遍历整个驱动器?
答案 0 :(得分:3)
您确实需要逐个文件遍历整个驱动器设置属性。您需要修改代码以递归到子目录中。显然,你实际上需要调用设置属性的函数。
基本方法如下:
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;
当您尝试在整个卷上运行它时,预计会花费很长时间。您将要在仅包含少量文件和几个子目录级别的目录上进行测试。
此外,请为您的代码做好准备,修改某些文件的属性失败。您不能期望执行卷宽操作,有时不会因安全性而遇到故障。使您的代码在这种情况下变得健壮。