Arbeiten mit Dateien für Fortgeschrittene.
Hier die etwas komplizierteren, aber auch mächtigeren Möglichkeiten der API-Funktion SHFileOperation und SHBrowseForFolder. Unter anderem geht es darum, beim Kopieren den entsprechenden Windows-Dialog (mit den fliegenden Dateien) anzuzeigen, oder Dateien beim Löschen in den Papierkorb zu verschieben.
unit SHD_Main; // Demonstration der API-Funktionen SHFileOperation und SHBrowseForFolder. // Zusammengebastelt von Simon Reinhardt S.Reinhardt@WTal.de interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, FileCtrl, ShellAPI, ShlObj; type TMainForm = class(TForm) BtnLoeschen: TBitBtn; BtnKopieren: TBitBtn; BtnVerschieben: TBitBtn; FileList: TListBox; BtnSuchen: TBitBtn; OpenDlg: TOpenDialog; BtnListeLoeschen: TBitBtn; procedure BtnSuchenClick(Sender: TObject); procedure BtnListeLoeschenClick(Sender: TObject); procedure BtnLoeschenClick(Sender: TObject); procedure BtnKopierenClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var MainForm: TMainForm; implementation {$R *.DFM} function GetFolder(Root:integer;Caption:string):string; var bi : TBROWSEINFO; lpBuffer : PChar; pidlPrograms, pidlBrowse : PItemIDList; begin if (not SUCCEEDED(SHGetSpecialFolderLocation(getactivewindow,Root,pidlPrograms))) then Exit; lpBuffer := StrAlloc(max_path); bi.hwndOwner := getactivewindow; bi.pidlRoot := pidlPrograms; bi.pszDisplayName := lpBuffer; bi.lpszTitle := pChar(caption); bi.ulFlags := BIF_RETURNONLYFSDIRS; bi.lpfn := nil; bi.lParam := 0; pidlBrowse := SHBrowseForFolder(bi); if (pidlBrowse<><>nil) then begin if (SHGetPathFromIDList(pidlBrowse, lpBuffer)) then Result:=lpBuffer; end; StrDispose(lpBuffer); end; {GetFolder} function FileOperation(QuellDateien:TStrings;Zielverz:string;Action:integer):boolean; var Operation : TSHFileOpStruct; i : integer; Quellen : string; begin with Operation do begin {Parent Window} wnd := Application.Handle; {was soll gemacht werden?} wFunc := Action; {Quelldateien nach pFrom kopieren} Quellen := ''; for i := 0 to QuellDateien.Count-1 do begin Quellen:=Quellen+QuellDateien[i]+#0; end; Quellen := Quellen+#0; pFrom := PChar(Quellen); {Zielverzeichnis nach pTo kopieren} pTo := PChar(ZielVerz); {Titel der Fortschrittanzeige} case Action of FO_Delete : lpszProgressTitle:='Dateien löschen'; FO_Copy : lpszProgressTitle:='Dateien kopieren'; FO_Move : lpszProgressTitle:='Dateien verschieben'; FO_Rename : lpszProgressTitle:='Dateien umbenennen'; end; { Flags für die Aktion einstellen ohne Fortschrittanzeige: fFlags := FOF_AllowUndo or FOF_Silent; ohne Bestätigung : fFlags := FOF_AllowUndo or FOF_NoConfirmation z.B. klammheimlich in den Papierkorb verschieben: fFlags := FOF_AllowUndo or FOF_Silent or FOF_NoConfirmation} fFlags := FOF_AllowUndo; end; {Und los gehts!} Result := SHFileOperation(Operation)=0; end; procedure TMainForm.BtnSuchenClick(Sender: TObject); var i : integer; begin if OpenDlg.Execute then begin for i := 0 to OpenDlg.Files.Count-1 do begin FileList.Items.Add(OpenDlg.Files[i]); end; end; end; procedure TMainForm.BtnListeLoeschenClick(Sender: TObject); begin FileList.Clear; end; procedure TMainForm.BtnLoeschenClick(Sender: TObject); begin FileOperation(FileList.Items,'',FO_Delete); FileList.Clear; end; procedure TMainForm.BtnKopierenClick(Sender: TObject); var ZielVerz : string; Move : boolean; begin with Sender as TBitBtn do begin Move:=Tag=1; end; ZielVerz:=GetFolder(CSIDL_Drives,'Zielverzeichnis auswählen:'); if ZielVerz<>'' then begin if ZielVerz[Length(ZielVerz)]<>'\' then ZielVerz:=ZielVerz+'\'; if Move then FileOperation(FileList.Items,ZielVerz,FO_Move) else FileOperation(FileList.Items,ZielVerz,FO_Copy); FileList.Clear; end; end; end.
Delphi 1 | Delphi 2 | Delphi 3 | Delphi 4 |
nicht getestet | Version nicht betroffen | getestet |
siehe auch:
Arbeiten mit Dateien (löschen, kopieren, verschieben...).
Wie kann ich alle Dateien in einem Verzeichnis löschen?