2009-06-12 24 views
9

つまり、指定されたディレクトリ削除する方法ファイルが

例内のパターンに一致するすべてのファイルを削除し、あなたがSHFileOperationを使用することができますDirectoryNameの

+0

あなたは正規表現を使用することができます。パターンマッチングのためにグーグルグーグルをしてください、RegExは私の専門ではありませんが、彼らは地獄のように強力です。 –

+2

(ファイルapisは通常、正規表現をサポートしていません。プレーンワイルドカードです。シェル正規表現やスクリプト言語の場合は完全正規表現です) –

答えて

22
procedure TForm1.Button1Click(Sender: TObject); 
begin 
    DeleteFiles(ExtractFilePath(ParamStr(0)),'*.jpg'); 
end; 

procedure DeleteFiles(APath, AFileSpec: string); 
var 
    lSearchRec:TSearchRec; 
    lPath:string; 
begin 
    lPath := IncludeTrailingPathDelimiter(APath); 

    if FindFirst(lPath+AFileSpec,faAnyFile,lSearchRec) = 0 then 
    begin 
    try 
     repeat 
     SysUtils.DeleteFile(lPath+lSearchRec.Name);  
     until SysUtils.FindNext(lSearchRec) <> 0; 
    finally 
     SysUtils.FindClose(lSearchRec); // Free resources on successful find 
    end; 
    end; 
end; 
+0

(lsearchrecを埋めておく必要はありません) –

+0

ありがとうございます。これはまさに私が探しているものです。 – volvox

+0

*正しくプログラミングしたい場合は、必ず* FillCharを実行してください。これは何もしないかもしれませんが、これは良い習慣です。ある日、もしあなたが良い習慣を持っていなければ、あなたは*大きな*トラブルに陥るでしょう。あなたは常にレコードが初期化されていないと仮定しなければならず、いつもメモリが0バイトで設定されているとは限りません。あなたは本当に悪いものの代わりに他の良い習慣を示すために、FillChar関数を戻さなければなりません。 –

5

をすべての* .jpgファイルを削除します。関数。 SHFileOperationの使い方については、ごみ箱にファイルを削除するオプションがあり、通常のAPIアニメーションが表示されるので、ユーザーは何が起こっているのかを知ることができます。欠点は、削除がJeffのコードよりも少し時間がかかることです。

いくつかのラッパーがあります。私はBP Softwareのこのフリーラッパーを使用します。ラッパーファイル全体はわずか220行で、読みやすく使いやすくなっています。私はこれをコンポーネントとしてインストールしません。私は、私のプロジェクトにこのユニットを追加し、必要に応じてオブジェクトを作成して解放するほうが簡単だと分かりました。

更新:BPソフトウェアサイトのダウンロードリンクはもう有効ではありません。 older version on the Embarcadero websiteがあります。

TSHFileOp(1.3.5.1)(3 KB)
月 31、2006 ごみ箱をサポートする、 動きをコピー、名前変更、または削除するSHFileOperation APIのラッパー (ある
TComponentは)ファイルシステム オブジェクト。

SHFileOperationのファイル名パラメータは、MS DOSスタイルのワイルドカードをサポートします。ですから、このようにコンポーネントを使用することができます:


     FileOps := TSHFileOp.Create(self); 

     FileOps.FileList.Add(DirectoryName + '\*.jpg'); 

     FileOps.HWNDHandle := self.Handle; 
     FileOps.Action := faDelete; 
     FileOps.SHOptions := 
      [ofAllowUndo, ofNoConfirmation, ofFilesOnly, ofSimpleProgress]; 
     FileOps.Execute; 

を私は通常、Windowsが再び尋ねないように自分自身がそう、私はいつもofNoConfirmationフラグを渡すメッセージ「あなたはよろしいです」と表示します。

すべてのjpgファイルを削除したくない場合や、複数のディレクトリから削除する必要がある場合は、executeを呼び出す前にFileList文字列リストに完全なファイル名または別のパスを追加できます。

ここではMSDN Page for SHFileOperation
SHFileOperationはWindows Vistaから始まるIFileOperationに置き換えられています。私は問題なくWindows Vista上でSHFileOperationを使い続けました。デルファイの最近のバージョンで

+0

TSHFileOpラッパーを試してみました。 – volvox

+0

リンクは死んでいます... – kobik

4

、あなたはおそらく、System.IOUtilsのクラスを使用することになり、実質的にFindFirstFindNextなどをラップしている:

procedure DeleteFilesMatchingPattern(const Directory, Pattern: string); 
    var FileName: string; 
begin 
    for FileName in TDirectory.GetFiles(Directory, Pattern) do TFile.Delete(FileName); 
end; 
関連する問題