2013-11-22 56 views
1

要更改文件的屬性很容易,請使用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; 

當您試圖在整個捲上運行它時需要很長時間。您需要在僅包含少量文件和幾個子目錄級別的目錄上進行測試。

另外,準備好修改屬性以使某些文件失敗的代碼。例如,由於安全性原因,您不能期望執行音量範圍廣泛的操作,而不會遇到故障。使您的代碼在這種情況下健壯。

+0

謝謝你回覆朋友, 在delphi 7中, TFileAction =引用過程(const FileName:string) 還沒有存在,但我可以根據我的需要調整第二個函數。 下面的代碼讓我可以搜索所有文件在partitition,並把它們屬於正常: 如果SetFileAttributes值(P Char((名稱+ '\' + F.Name)),FILE_ATTRIBUTE_NORMAL)然後 SetFileAttributes值(P Char(Form1中.Edit1.Text),FILE_ATTRIBUTE_HIDDEN); **謝謝我的朋友** – Bill