Operacja na plikach (WinAPI)

TOY

Jeśli chodzi o operacje na plikach to Delphi udostępnia nam te możliwości, lecz są one ubogie. Moduł ShellAPI udostępnia nam znacznie bardziej rozbudowany arsenał poleceń i funkcji. Na początek zajmiemy się kopiowaniem.

Konieczne jest utwotzenie zmiennej typu TSHFileOpStruct. Zobaczcie:

var
     P : TSHFileOpStruct;
begin
   P.Wnd := Handle;
   P.wFunc := FO_COPY;
   P.pFrom := 'C:\plik.xxx';
   P.pTo := 'C:\katalog\plik.xxx';
   P.fFlags := FOF_RENAMEONCOLLISION or FOF_SIMPLEPROGRESS;
   p.fAnyOperationsAborted := True;
   P.lpszProgressTitle := 'Trwa kopiowanie pliku...';
   SHFileOperation(P);
end;

Pierwsza linijka jest to uchwyt. Druga linijka jest odpowiedzialna za czynność jaka zostanie wykonana. Mamy cztery opcje do wyboru:

  • FO_COPY - kopiuje z pFrom do pTo
  • FO_DELETE - usuwa plik z pFrom
  • FO_RENAME - zmienia nazwę
  • FO_MOVE - przemieszcza plik z pFrom do pTo
    Kolejne dwie linijki są chyba jasne po wyjaśnieniu drugiej linijki, więc oszczędzę sobie pisania.

W poleceniu fFlags ustawiamy właściwości przeprowadzanej operacji. Możemy zastosować następujące komendy:

  • FOF-ALLOWUNDO - możliwe jest cofnięcie operacji
  • FOF_FILESONLY - przenosi tylko pliki z folderu, a nie z podfolderu
  • FOF_NOCONFIRMATION - w razie konieczności nie jest wyświetlana informacja (np. w przypadku istnienia pliku o tej samej nazwie)
  • FOF_NOCONFIRMMKDIR - nie tworzy nowego folderu, jeżeli operacja tego wymaga
  • FOF_SILENT - okno kopiowania nie zostanie wyświetlone
  • FOF_SIMPLEPROGRESS - wyświetla wybrany przez Ciebie tekst w polu lpszProgressTitle, a nie wyswietla kopiowanego pliku
  • FOF_RENAMEONCOLLISION - w przypadku istnienia pliku o tej samej nazwie, jego nazwa jest zmieniona
    Przedostatnie polecenie fAnyOperationsAborted określa możliwość anulowania danego procesu i jak łatwo się domyślić przyjmuje wartość Boolean, czyli True lub False.
    Bez ostatniej linijki SHFileOperation(P) program nic by nie zrobił. Jest to jakby polecenie WYKONAJ, które należy zawsze stosować przy takich operacjach na plikach jak te, które opisałem powyżej.

7 komentarzy

mam drivercombobox i z niego wychodzi char U
jak mam teraz zrobić, żeby p.from było równe U?
póki nie dodam U+':' nie działa, ale to nie jest pAnsiChar...
co robić?

Dobra, poprawiłem formatowanie, literówki, wprowadziłem polskie znaki itp :)

Autor chyba za słabo sie postarał, a poza tym jest już taki artykuł na 4p.

Juz jest taki artykul w serwisie.

Błędy ortograficzne, literówki i brak formatowania kodu. Kiszka :-(

O ile pamiętam, to coś podobnego jest w FAQ i to rozmiarami także tam powinno wylądować, ale ze względu na bałagan panujący w FAQ, sądzę, że należałoby na razie to zostawić tutaj (przynajmniej do czasu uporządkowania FAQ)

Oczywiscie ten sposób umozliwia nam kopiowanie calych katalogów, czego nie da sie zrobic poleceniem CopyFile, udostepnionym
przez Delphi. :)