Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Jak usunąć najstarszy plik z folderu.
Forum PHP.pl > Forum > Przedszkole
Szunaj85
Wiem, że pliki usuwa się za pomocą polecenia unlink();
W folderze "Folder" mam kilka plików.
Powiedzmy: Plik_1, Plik_2, Plik_3, Plik_4, Plik_5.
Jak teraz odnaleźć i usunąć jeden najstarszy z nich?
nospor
Przelatujesz po wszystkich plikach w katalogu.
Dla każdego sprawdzasz datę utworzenia.
Wyłapujesz plik najstarszy - usuwasz go.

Wszystko co niezbędne masz tu:
Funkcje obsługi plików
Rid
Może Pan sprawdzić to po czasie ostatniej modyfikacji pliku.
Polecenie filectime($nazwa_pliku)
Tutaj ma Pan duże informacje o operacjach na plikach.
Szunaj85
Znalazłem taki kod, ale on tylko wyświetla wyniki od najstarszego do najmłodszego. Mimo moich prób nie jestem w stanie usunąć pierwszego pliku z listy.
  1. $sciezka = './folder/';
  2.  
  3. $lista=array();
  4. $katalog = opendir($sciezka);
  5. while ($plik = strtolower(readdir($katalog))) {
  6. if ($plik<>'.' && $plik<>'..') {
  7. if (is_dir($sciezka.$plik))
  8. $lista["[$plik]"]=filemtime($sciezka.$plik);
  9. else
  10. $lista[$plik]=filemtime($sciezka.$plik);
  11. }
  12. }
  13. closedir($katalog);
  14.  
  15. asort($lista);
  16. $i=1;
  17. while (list ($klucz, $wartosc) = each ($lista)) {
  18. echo '<br />'.$i.' '. $klucz.' ['.date('d.m.Y', $wartosc).']';
  19. $i++;
  20. }
gorden
  1. $najstarszy = 0;
  2. while(false !== ($plik = readdir(opendir('pliki/')))) if($plik != '.' && $plik != '..' && filemtime($plik) > $najstarszy) {
  3. $plikname = $plik;
  4. $najstarszy = filemtime($plik);
  5. }
  6. unlink($plikname);
  7. echo 'Usunięto:'.$plikname;

może takie cuś?
Fifi209
Raczej coś takiego:
  1. <?php
  2.  
  3. $files = array_diff(scandir('pliki'), array('.', '..'));
  4.  
  5. $t = 0;
  6. $name = '';
  7.  
  8. foreach ($files as $file) {
  9. if ($t == 0) {
  10. $t = filemtime('pliki/'.$file);
  11. }else{
  12. if (filemtime('pliki/'.$file) < $t) {
  13. $t = filemtime('pliki/'.$file);
  14. $name = 'pliki/'.$file;
  15. }
  16. }
  17. }
  18.  
  19. echo 'Najstarszy plik to: '.$name;
  20.  
  21. ?>


@up
Twój kod działa w nieskończoność - testowałem.
Poza tym:
  1. filemtime($plik) > $najstarszy

Szukasz najmłodszego pliku a nie najstarszego, im mniejsza liczba tym wcześniejsza data, a nie na odwrót.
Szunaj85
Fifi209 a sprawdzałeś czy Twój kod działa?
Bo mi wyświetla tylko samą treść "echo" bez zmiennej "$name". I nie mogę znaleźć przyczyny tego problemu. sad.gif
Fifi209
Sądzisz, że bym nie sprawdzał przed wrzuceniem na forum? Musiałem się przecież upewnić, że wszystko zapięte na ostatni guzik.
closedeyes.gif

wstaw na początek skryptu
Szunaj85
Cytat
wstaw na początek skryptu
Nadal tak samo. sad.gif
Nie wyświetla żadnego błędu, a wiem, że "error_reporting" działa ponieważ chwilę wcześniej nie podmieniłem wszystkich nazw folderów w kodzie i wyświetlił mi błędy. Gdy to poprawiłem już nic nie wyświetla.

Edit:
Na innym serwerze wyświetla mi taki błąd bez pomocy "error_reporting".
Fatal error: Call to undefined function: scandir() in /var/www/sites/*****/p/r/*****/*****.php on line 2
Fifi209
Włącz sobie php 5 bo chyba od tej wersji dostępny jest scandir o ile dobrze pamiętam.
Szunaj85
Na tym serwerze gdzie nie wyświetlało żadnego błędu jest wersja php 5.2, sprawdziłem za pomocą.
  1. echo PHP_VERSION;"
W informacji o serwerze też jest tak samo. Więc jeśli to zależało by od wersji to skrypt powinien działać.
Na drugim serwerze gdzie wyświetlił mi się błąd faktycznie jest wersja php 4.4.
Więc wygląda na to, że problem leży gdzie indziej. sad.gif
Fifi209
Tutaj poprawiony kod, działa nawet gdy są dwie takie same daty (tamten się wykruszał)
  1. <?php
  2.  
  3. $dir = 'pliki';
  4.  
  5. $files = array_diff(scandir($dir), array('.', '..'));
  6.  
  7. echo '<pre>';
  8. print_r($files);
  9. echo '</pre>';
  10.  
  11. $t = 0;
  12. $name = '';
  13.  
  14. foreach ($files as $file) {
  15. if ($t == 0) {
  16. $t = filemtime($dir.'/'.$file);
  17. $name = $dir.'/'.$file;
  18. echo $t.'-'.$file.'<br/>';
  19. }else{
  20. if (filemtime($dir.'/'.$file) < $t) {
  21. $t = filemtime($dir.'/'.$file);
  22. echo $t.'-'.$file.'<br/>';
  23. $name = $dir.'/'.$file;
  24. }
  25. }
  26. }
  27.  
  28. echo 'Najstarszy plik to: '.$name;
  29.  
  30. ?>
Szunaj85
Wygląda na to, że działa. Jednak dopiero gdy w folderze którym trzymam pliki znajduje się inny folder - nawet pusty.
Dlaczego tak się dzieje i czy da się to wyeliminować, jednak tak żeby można również sprawdzać pliki zamieszczone głębiej? co_jest.gif
Fifi209
A to nikt nie mówił, że ma być głębiej. To już jest większa zabawa, jak będę miał czas wieczorem to coś wyskrobię (może)
Szunaj85
Cytat
A to nikt nie mówił, że ma być głębiej. To już jest większa zabawa, jak będę miał czas wieczorem to coś wyskrobię (może)
To to dla mnie mniej ważna kwestia i nie musisz się tym przejmować. wink.gif
Jedyne co chciałbym wyjaśnić to sprawę związaną z koniecznością obecności folderu w folderze w którym trzymam pliki żeby skrypt działał. tongue.gif
Fifi209
Cytat(Szunaj85 @ 18.07.2011, 17:24:52 ) *
To to dla mnie mniej ważna kwestia i nie musisz się tym przejmować. wink.gif
Jedyne co chciałbym wyjaśnić to sprawę związaną z koniecznością obecności folderu w folderze w którym trzymam pliki żeby skrypt działał. tongue.gif

U mnie ten problem nie występuje.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.