Usuwanie całej zawartości danego katalogu

Odpowiedz Nowy wątek
Krzywy Samiec
2016-03-11 18:02
Krzywy Samiec
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?

Pozostało 580 znaków

2016-03-11 18:08

Rejestracja: 5 lat temu

Ostatnio: 3 dni temu

Lokalizacja: Warszawa

0

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

Pozostało 580 znaków

2016-03-11 18:15

Rejestracja: 12 lat temu

Ostatnio: 23 godziny temu

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

Pozostało 580 znaków

Krzywy Samiec
2016-03-11 18:20
Krzywy Samiec
0

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

Pozostało 580 znaków

2016-03-11 19:29
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 8 godzin temu

Lokalizacja: Tuchów

0

http://stackoverflow.com/ques[...]ders-recursively-using-delphi - ewentualnie dodaj sobie małe przeróbki na własne potrzeby.


Pozostało 580 znaków

satq
2016-03-11 19:38
satq
0
ShellExecute(Handle, 'open', 'cmd.exe', '/K del *.*', 'C:\Windows\', SW_SHOWNORMAL);
edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26

Pozostało 580 znaków

2016-03-11 21:02
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 8 godzin temu

Lokalizacja: Tuchów

2

@satq</span> - 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.


edytowany 1x, ostatnio: furious programming, 2016-03-11 21:05
z parametrem /K to nawet nie mignie, tylko pozostanie. - Azarien 2016-03-11 21:24
No to jeszcze gorzej; Tutaj fajnie można by pobawić się w WinAPI, jednak preferowałbym rozwiązanie stricte pascalowe, oczywiście rekurencyjne; Co by się nie wybrało to i tak powyższy sposób należy zignorować; - furious programming 2016-03-11 21:33
Napiszę później przykładowy kod, czyszczący katalog i ewentualnie usuwający go; - furious programming 2016-03-11 21:34

Pozostało 580 znaków

2016-03-11 22:17

Rejestracja: 11 lat temu

Ostatnio: 1 dzień temu

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;

Pozostało 580 znaków

2016-03-11 22:41
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 8 godzin temu

Lokalizacja: Tuchów

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.


Pokaż pozostałe 3 komentarze
Miałem na myśli flagę FOF_FILESONLY i to co się będzie działo z podkatalogami przy SubDirectories równym True; Podkatalogi zostaną tylko wyczyszczone, czy także usunięte? - furious programming 2016-03-11 23:26
No przecież napisałem, że tak samo jak przy ręcznym usuwaniu zawartości folderu. Jeśli będzie można usunąć podfolder(-y), to się usunie, to chyba oczywiste. - marogo 2016-03-11 23:40
Skoro tak samo, to nie mam więcej pytań ;) - furious programming 2016-03-11 23:41
Dobranoc :) - marogo 2016-03-11 23:42

Pozostało 580 znaków

2016-03-12 22:17
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 8 godzin temu

Lokalizacja: Tuchów

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


edytowany 3x, ostatnio: furious programming, 2016-03-12 22:19

Pozostało 580 znaków

Opi
2016-03-12 22:55
Opi

Rejestracja: 15 lat temu

Ostatnio: 4 miesiące temu

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

Pozostało 580 znaków

Odpowiedz

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