Usuwanie plików starszych niż X dni

0

Potrzebna mi jest funkcja która pozwoli usunąć pliki starsze niż np: 10 dni.
Chodzi o usuwanie przestarzałych raportów.

Zrobiłem co prawda działającą funkcję do tego, ale boję się aby nie wystąpił błąd przy obróbce (porównywaniu) daty aktualnej (systemowej) z pobraną z pliku (ostatnia modyfikacja pliku).

Oto kod:

function WiekPliku(Plik, Dni : string) : Boolean;
var
  SearchRec : TSearchRec;
  Bylo, Jest: TDateTime;
begin
  Result := False;
  Jest   := Date;

  if FindFirst(Plik, faAnyFile, SearchRec) = 0 then
  begin
    Bylo := FileDateToDateTime(SearchRec.Time);
    FindClose(SearchRec);
    if inttostr(DaysBetween(Jest, Bylo)) >= Dni then Result := True
    else Result := False;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if WiekPliku(Edit1.Text, '10') = True then // DeleteFile(Edit1.Text);
 ShowMessage('Plik jest stary: ma ponad 10 dni')
else
 ShowMessage('Plik jest nowy: ma mniej niż 10 dni');
end;

Jeśli macie jakieś gotowe procedury do rozpoznawania "wieku pliku" to proszę o podanie [soczek]

0

Słuchaj. Bezpośrednie kasowanie plików trochę mija się z celem, wiem z doświadczenia że jeżeli plików w katalogu jest bardzo dużo to się stasznie długo taki katalog otwiera i w ogóle to jest koszmar. dobrym pomysłem jest stworzyć plik w którym (np. w postaci rekordów) zapisujesz informacje o wygenerowanych logach w momencie ich powstania. Potem kiedy chcesz je usunąć to wczytujesz jedynie dane z tego pliku(bazy)gdzie już sobie spokojnie zapisałeś np date i godzine utworzenia pliku wraz z jego nazwą. Kiedy chcesz je usuwać odwołujesz się jedynie do ścieżki jaką zapisałeś w pliku (bazie)i usuwasz wpis w pliku.

0
irek napisał(a)

[...] dobrym pomysłem jest stworzyć plik w którym (np. w postaci rekordów) zapisujesz informacje o wygenerowanych logach w momencie ich powstania. Potem kiedy chcesz je usunąć to wczytujesz jedynie dane z tego pliku(bazy)gdzie już sobie spokojnie zapisałeś np date i godzine utworzenia pliku wraz z jego nazwą. Kiedy chcesz je usuwać odwołujesz się jedynie do ścieżki jaką zapisałeś w pliku (bazie)i usuwasz wpis w pliku.

A wiesz że to dobry pomysł :)
Szkoda tylko bo widze w tym więcej pracy ale jeśli ma być uniwersalny... ?

na razie czekam na kolejne odpowiedzi ;)

0

Możesz zrobić tak - program uruchamiany codziennie (np.: przez Harmonoram).

Wczytuje z katalogu plik z listą rekordów (data:TDateTime, nazwapliku:string).

Przeglądając plik po pliku w katalogu sprawdza:

  • jeśli plik z katalogu jest w liście i jednocześnie (DaysBetween( Now(), DataDlaPlikuZListy) > 10) - usuń plik z listy oraz usuń plik;
  • jeśli pliku nie ma na liście dodaj wpis (Now(), NazwaPliku)

Po przejrzeniu wszystkich plików, zapisz plik listy z powrotem.

0

a nie można tych raportów nazywać datą?, np.

Raport pana zdziśka 2005-09-24.doc

lub jakoś tak

0

Po pierwsze trzeba ustalić czy system ma prawo podróżować w czasie - jeśli tak to w pliku trzebaby zliczać kolejne dni lub uruchomienia:), jeśli nie to mozna kasować po dacie.
Po drugie pomysł z plikiem jest dobry ale wykonanie do d... przecież usuwanie plików musi odbywać się rzeczywiście a nie poprzez usunięcie informacji w pliku o nich, bo dysk się zapcha nieskasowanymi raportami. Pytanie brzmi ile tych raportów będzie, jeśli jakaś sensowana ilość to tworzymy dla nich katalog i są w nim tylko one, co oznacza że przez 10 dni nie powinno się uzbierać na tyle dużo plików aby "muliło"
Po trzecie: zrób katalog raporty a w nim katalogi na każdy dzień - jeśli nie przeszkadza to w funkcjonowaniu aplikacji, a raporty są tylko wynikiem jej działania a nie są co chwilę wczytywane. Wówczas chćac kasować usuwasz tylko katalogi wraz z zawartością bez sprawdzania co w środku - chodzi bardzo szybko bo porównujesz tylko nazwy (daty) katalogów - jeśli co dziesięć dni to bęzdie 11 katalogów...

0
Andrzej Dąbrowski napisał(a)

Po pierwsze trzeba ustalić czy system ma prawo podróżować w czasie - jeśli tak to w pliku trzebaby zliczać kolejne dni lub uruchomienia:), jeśli nie to mozna kasować po dacie.
Po drugie pomysł z plikiem jest dobry ale wykonanie do d... przecież usuwanie plików musi odbywać się rzeczywiście a nie poprzez usunięcie informacji w pliku o nich, bo dysk się zapcha nieskasowanymi raportami. Pytanie brzmi ile tych raportów będzie, jeśli jakaś sensowana ilość to tworzymy dla nich katalog i są w nim tylko one, co oznacza że przez 10 dni nie powinno się uzbierać na tyle dużo plików aby "muliło"
Po trzecie: zrób katalog raporty a w nim katalogi na każdy dzień - jeśli nie przeszkadza to w funkcjonowaniu aplikacji, a raporty są tylko wynikiem jej działania a nie są co chwilę wczytywane. Wówczas chćac kasować usuwasz tylko katalogi wraz z zawartością bez sprawdzania co w środku - chodzi bardzo szybko bo porównujesz tylko nazwy (daty) katalogów - jeśli co dziesięć dni to bęzdie 11 katalogów...

Rozwiązanie jest do bani [!!!]
Obecnie każdy profesjonalny program opiera się o plik katalogujący zbiory czyli tak jak opisałem w poście wyżej.
Gdybyś przeczytał uważniej zauważył byś że napisałem tam że na podstawie ścieżki w tym pliku usuwamy plik (fizycznie usuwamy z dysku) a następnie usuwamy wpis w pliku.
Co do podróży w czasie to trzeba po prostu uruchomić skrypt który pobiera czas z serwera np wstawić w run systemu net time \nazwa_servera /set /yes i tyle

A tworzenie skomplikowanej struktury katalogów itd ... no weź się zastanów.

0

Raporty są tworzone w jednym folderze na nie przeznaczonym.

Z tym kodem co podałem nie byłoby żadnego problemu gdyby nie fakt iż u niektórych format daty krótkiej jest zmieniany i wtedy robi się nieciekawie.
Błąd: is not a valid date. A że jest to szuakać trzeba alternatywy (nie mylić z filmem "Alternatywy4" :D ).

Wydaje mi się że pomysł z założeniem osobnego pliku w którym jest spis plików jest najbardziej trafiony. Dodam że pliki raportów mają w nazie dodatkowo wygenerowaną date np: raport_dd-mm-rrrr godzgodz-minmin.log

Dzieki Wszystkim za dotychczasowe propozycje rozwiązania problemu [soczek]

0

(fizycznie usuwamy z dysku)

No to chyba raczej niemożliwe :)

0

Hallo Opi!

Proponuje Ci rozwiazanie z wykorzystaniem FileListBox:

for i := 0 to (FileListBox1.Items.Count - 1) do
  if DaysBetween(Now, FileDateToDateTime(FileAge(FileListBox1.Items[i]))) > 10      \\roznica wieksza niz 10 dni
  then DeleteFile(FileListBox1.Items[i]);

Pozdrawiam
Markus
[???]

0
MarkusB napisał(a)

Proponuje Ci rozwiazanie z wykorzystaniem FileListBox:

Dzięki MarkusB. N a p e w n o się przyda, choć troszkę przerobię na potrzeby ShellListVIew

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