Usuwanie całej zawartości danego katalogu

0

Witajcie
W mojej aplikacji posiadam możliwość zapisu danych do pliku. Podczas jednego uruchomienia aplikacji może być wiele zapisów do różnych plików o nazwie wprowadzonej przez użytkownika. Nie wiadomo więc ile będzie takich plików ani jaka będzie ich wielkość lecz wiadomo, że wszystkie pliki będą w folderze o nazwie "abc". Problem polega na tym, że chciałbym usunąć wszystkie zapisane przez użytkownika pliki podczas zamykania aplikacji pozostawiając pusty folder "abc". Istnieje na to jakaś metoda czy trzeba by znać wszystkie nazwy plików?

0

Napisz metodę kasującą rekurencyjnie folder abc a następnie utwórz go ponownie :)

0

Można użyć FindNext i FindFirst itp. ale najlepiej będzie jak zapamiętasz nazwy plików zapisane przez usera bo bez tego usuniesz wszystko z danego folderu

0

Właśnie to ma usunąć wszystko ;)

0

http://stackoverflow.com/questions/11798783/delete-all-files-and-folders-recursively-using-delphi - ewentualnie dodaj sobie małe przeróbki na własne potrzeby.

0
ShellExecute(Handle, 'open', 'cmd.exe', '/K del *.*', 'C:\Windows\', SW_SHOWNORMAL);
2

@satq - to jest złe rozwiązanie z co najmniej dwóch powodów; Flaga SW_SHOWNORMAL spowoduje, że na ekranie mignie konsola Windows, a to źle; Po drugie - hardkodowana ścieżka katalogu systemu? RLY?

Jak już koniecznie bawić się cmd to tak, aby okno konsoli było niewidoczne, a ścieżkę katalogu pobierać za pomocą SHGetSpecialFolderPath (ze względu na wsteczną kompatybilność) lub SHGetFolderPath;

Najlepsze rozwiązanie nie zawsze jest najkrótsze.

1
procedure DeleteDirectoryContent(DirPath, Mask: string; SubDirectories: Boolean);
var
  FromList: string;
  Struct: TSHFileOpStruct;
begin
  FillChar(Struct, SizeOf(Struct), 0);
  Struct.Wnd := Application.MainForm.Handle;
  Struct.wFunc := FO_DELETE;
  FromList := DirPath + '\' + Mask + #0;
  Struct.pFrom := PChar(FromList);
  Struct.fFlags := Struct.fFlags or FOF_NOCONFIRMATION or FOF_SILENT;
  if not SubDirectories then
    Struct.fFlags := Struct.fFlags or FOF_FILESONLY;
  SHFileOperation(Struct);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   DeleteDirectoryContent('d:\abc', '*.*', true);
end;
 
0
FromList := IncludeTrailingPathDelimiter(DirPath) + Mask + #0;

Można też skorzystać z PathDelim; Ale czy ten powyższy kod zawsze usunie całą zawartość katalogu i pozostawi go jako pusty? Nie chodzi mi o błędy braku dostępu do danego pliku.

0

Przy okazji dopiszę, że jest jeszcze System.IOUtils.TDirectory.Delete - warto by sprawdzić tę metodę;

A jeśli ktoś potrzebuje rozwiązania dla FPC, to w module FileUtil jest funkcja DeleteDirectory, która albo czyści całą zawartość wskazanego katalogu, albo w całości go usuwa, w zależności od wartości parametru OnlyChilds; Miałem napisać coś w ten deseń jak obiecałem, jednak znalazłem tę funkcję (która jest niemalże identyczna z tym co pisałem) przez przypadek, kiedy szukałem informacji o tym, dlaczego RemoveDir nie usuwał mi katalogów :D

0

Pliki użytkownika powinny mieć prefix lub surfix, które je odróżnia od plików programu. Ewentualnie wystarczy zwykłe rozszerzenie np.:
pliki_programu.abcx
pliki_uzytkownika.abcy

Potem tylko usuwasz wszystkie pliki z rozszerzeniem .abcy

0

@Opi - jeśli wszystkie pliki użytkownika znajdują się w zadanym katalogu (tym bardziej np. w LOCAL_APP_DATA) to nie ma potrzeby kombinować z rozszerzeniami; A co w przypadku, gdy użytkownik ma prawo za pomocą programu tworzyć i gromadzić pliki z popularnymi rozszerzeniami, jak .txt czy .png, które także wykorzystuje ów aplikacja?

Najważniejsze jest to, aby użytkownik nie trzymał swoich plików między plikami aplikacji; Jednak i tego nie można zabezpieczyć w 100%, bo poza programem użytkownik może wiele namieszać.

0
satq napisał(a):
ShellExecute(Handle, 'open', 'cmd.exe', '/K del *.*', 'C:\Windows\', SW_SHOWNORMAL);

Panowie furious programming i Azarien to miała być tak zwana wędka a nie obiad w Sheraton-ie, wystarczy odpowiednio zmienić parametry i rozwiązanie jest gotowe... czy pytający jest całkowicie zwolniony z myślenia ?

0

Nie zwalnia z myślenia, jednak jeśli podajesz gotowca (a podałeś) to wypadałoby, aby był sprawny i działał według założeń i potrzeb osoby pytającej; A Ty podałeś tylko i wyłącznie kod, bez żadnego opisu czy notki o konieczności modyfikacji we własnym zakresie - dlatego to skomentowaliśmy;

Do tego wrzuciłeś kod bez znaczników kolorowania składni, stąd tez i moja poprawka :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1