Jak przenieść, skasować, zmienić nazwę katalogu

Adam Boduch

Najlepiej jest skorzystać z modułu ShellAPI. Oto przykład:

uses ShellAPI;

procedure Kopiuj();
var R: TSHFileOpStruct;
begin
ZeroMemory(@R, sizeof(R));
with R do
  begin
  Wnd:=GetDesktopWindow();  //oznaczenie uchwytu
  wFunc:=FO_COPY;           //rodzaj operacji
  pFrom:='c:\source'#0;       //katalog zrodlowy
  pTo:='d:\destination'#0;    //katalog docelowy
  fFlags:=FOF_NOCONFIRMMKDIR;
  end;
if (SHFileOperation(R)<>0) then
  ShowMessage('Błąd podczas kopiowania')
end;

Zamiast parametru FO_COPY, oznaczającego rodzaj żądanej operacji, można użyć:

FO_DELETE - kasowanie pFrom,
FO_RENAME - zmiana nazwy z pFrom na pTo,
FO_MOVE - przeniesienie z pFrom do pTo.

Jak w typowych operacjach ShellAPI, ścieżki katalogów (pFrom, pTo) muszą być zakończone podwójnym znakiem o kodzie #0 (własnie dlatego dopisany jest dodatkowy znak #0). Można dokonywać także operacji na wielu plikach jednocześnie, wtedy kolejne sieżki oddziela się znakiem #0.

Problemu związanego z dodatkowym znakiem #0 nie należy lekcaważyć (wiele razy pojawiał się post na forum - SHFileOperation nie działa) dla przykładu podaje kod powodujący błąd (to, że zazwyczaj w pamięci po ostatnim zerze, jest zazwyczaj następne to tylko zbieg okoliczności) :

procedure Kopiuj();
var
 R: TSHFileOpStruct;
const
// dup:pchar = 'c:\w\1.txt'#0#0'cos dalej w pamieci'; //tak bedzie dzialalo
  dup:pchar = 'c:\w\1.txt'#0'cos dalej w pamieci';  //a tak nie bedzie dzialalo
begin
ZeroMemory(@R, sizeof(R));
with R do
  begin
  Wnd:=GetDesktopWindow();  //oznaczenie uchwytu
  wFunc:=FO_COPY;           //rodzaj operacji
  pFrom:=dup;       //plik-katalog zrodlowy
  pTo:='c:\w\2.txt';    //plik-katalog docelowy
  fFlags:=FOF_NOCONFIRMMKDIR;
  end;
if (SHFileOperation(R)<>0) then
  ShowMessage('Błąd podczas kopiowania')
end;
FAQ

4 komentarzy

No w sumie fakt. Sorry za wprowadzenie w błąd.

Wydaje mi się, że wyzerowanie, w miejsce wskaźnika pFrom i pTo wstawi zero. jednak nijak się to ma do wstawienia zero na koniec ciągu napisów (tu konwersja PChar -> wystarczy w kodzie HEX poszukac i bedzie zakonczony zerem, jak się coś doda to wyświetli więcej). Zerowanie ma raczej na celu to aby nie pojawiły się przypadkowe rzeczy w nieużywanych polach.

No i właściwie zgodnie z MSDN

Each file name must be terminated by a single NULL character. An additional NULL character must be appended to the end of the final name to indicate the end of pFrom.

powinno się zakańczać dwoma zerami.

Pchar(edit1.text)

a jak zrobić żeby te pliki przenosiły się na przykład do ścieżki która jest stringiem?