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

时间:2013-11-22 10:55:17

标签: delphi

使用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;

但是如何使用它来遍历整个驱动器?

1 个答案:

答案 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;

当您尝试在整个卷上运行它时,预计会花费很长时间。您将要在仅包含少量文件和几个子目录级别的目录上进行测试。

此外,请为您的代码做好准备,修改某些文件的属性失败。您不能期望执行卷宽操作,有时不会因安全性而遇到故障。使您的代码在这种情况下变得健壮。