Deleting all files from a folder

Question

Is there a simple Delphi4.0 equivalent to the following DOS command:
delete c:\f\p\*.*
In other words, is there a command, or procedure, to delete all files from a sub-directory?

Answer by John, DelphiLand Team

Delphi itself doesn't have a routine for deleting multiple files at once, but you can use the Windows function (a so-called API function) SHFileOperation.

The Delphi "interface" for SHFileOperation is defined in Delphi's unit SHELLAPI, so firstly add SHELLAPI to the uses-clause on top of your unit:

interface
uses
  Windows, Messages, ..., SHELLAPI;

Let's wrap this function in a procedure that is suitable for re-use. Add the following function at the top of the implementation section of your unit:

procedure DelFilesFromDir(Directory, FileMask: string; DelSubDirs: Boolean);
var
  SourceLst: string;
  FOS: TSHFileOpStruct;
begin
  FillChar(FOS, SizeOf(FOS), 0);
  FOS.Wnd := Application.MainForm.Handle;
  FOS.wFunc := FO_DELETE;
  SourceLst := Directory + '\' + FileMask + #0;
  FOS.pFrom := PChar(SourceLst);
  if not DelSubDirs then
    FOS.fFlags := FOS.fFlags OR FOF_FILESONLY;
  // Remove the next line if you want a confirmation dialog box
  FOS.fFlags := FOS.fFlags OR FOF_NOCONFIRMATION;
  // Uncomment the next line for a "silent operation" (no progress box)
  // FOS.fFlags := FOS.fFlags OR FOF_SILENT;
  SHFileOperation;
end;

Below is a source code example that deletes all the files from directory (folder) C:\TEST, without deleting the subdirectories that might be present in C:\TEST (if you also want to delete all of the subdirectories and their contents, specify TRUE for the last parameter of DelFilesFromDir):

procedure TForm1.Button1Click(Sender: TObject);
begin
  DelFilesFromDir('C:\TEST', '*.*', FALSE);
end;

If you also want to delete all of the subdirectories of C:\TEST and their contents, specify:

DelFilesFromDir('C:\TEST', '*.*', TRUE);

John, DelphiLand Team