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;
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?