Programowanie w języku Delphi » Artykuły

Operacja na plikach (WinAPI)

  • 2009-02-08 01:42
  • 7 komentarzy
  • 1161 odsłon
  • Oceń ten tekst jako pierwszy
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

andrusek 2011-11-12 11:01

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

Coldpeer 2006-04-03 08:24

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

kslukasz 2005-05-05 09:08

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

Adam Boduch 2003-11-19 16:05

Juz jest taki artykul w serwisie.

ŁF 2003-11-19 12:52

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

Dryobates 2003-11-19 12:18

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)

TOY 2003-11-18 23:24

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