Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Rekurencyjna zmiana nazwy pliku
Forum PHP.pl > Forum > Przedszkole
b4rt3kk
Funkcja ma na celu wczytanie nazwy pliku, sprawdzeniu w danej lokalizacji czy plik już istnieje, jeśli tak to dodawany jest numerek (1 jeśli nie ma żadnej cyfry na końcu lub cyfra kolejna jeśli już jakaś na końcu jest), po czym zapisywana jest nowa nazwa pliku i funkcja wywołuje samą siebie dla nowej nazwy, jeśli jest wolna następuje zapis.


  1. function zapis_pliku ($nazwa_pliku) {
  2.  
  3. $sciezka="wyslane/".$nazwa_pliku;
  4.  
  5. if (file_exists($sciezka)) { // Jeśli plik istnieje zmieniamy jego nazwę.
  6. $tablica=explode(".",$nazwa_pliku);
  7. $nazwa_pliku=$tablica[0];
  8. $i=strlen($nazwa_pliku);
  9. $liczba=$nazwa_pliku[$i-1];
  10. if (is_numeric($liczba)) { // Jeśli ostatni znak nazwy pliku jest liczbą, zwiększana jest o 1.
  11. $liczba++;
  12. for ($j=0; $j<strlen($nazwa_pliku)-1; $j++) {
  13. $nowa_nazwa.=$nazwa_pliku[$j];
  14. }
  15. $nowa_nazwa.=$liczba.".".$tablica[1];
  16. } else { // Jeśli ostatnim znakiem nie jest cyfra, dodawana jest jedynka.
  17. $nowa_nazwa=$nazwa_pliku."1.".$tablica[1];
  18. }
  19. echo $nowa_nazwa;
  20. zapis_pliku($nowa_nazwa);
  21. } else
  22. {
  23. move_uploaded_file($_FILES['userfile']['tmp_name'], "wyslane/".$nazwa_pliku);
  24. }
  25.  
  26. }


Nie wiem, czemu to nie działa (tworzą się pliki o nazwach test.txt, test1.txt, test2.txt i dalej nic tzn. strona się wiesza, a wysyłam plik o nazwie test.txt), a po pewnym czasie skrypt się wiesza i strona się nie wczytuje.
Cysiaczek
Nie sprawdzałem dalej, ale kod:
  1. $liczba=$nazwa_pliku[$i-1];

$liczba zawiera w przypadku pliku test1 == 1
w przypadku test2 == 2
ale w przypadku test10 == 0
I to pewnie powoduje problem.

Obrałeś złą drogę. Zrób coś takiego: test_1.txt
Explode możesz zrobić po '_' i rzutować typ na integer. Dzięki temu nie zgubisz numeru pliku.

Drugi problem, to to, ze nie sprawdzasz, czy plik istnieje zanim go zapiszesz (linia 20), a z rekurencją trzeba uważać - musisz zawsze ustalić punkty graniczne.

Ogólnie to zamiast rekurencji, możesz tu zastosować prostą pętlę:
  1. do{
  2. $filename='cos'; // cały algorytm nadawania nazwy pliku
  3. }
  4. while(file_exists($filename));


Aby jeszcze ograniczyć ilość wykonywanych obrotów pętli, możesz spróbować wczytać ostatnio utworzony plik (wg czasu) i z niego pobrać aktualny numerek:
Czyli szkic algorytmu taki:

do:
1. Wczytaj ostatnio utworzony plik
2. Inkrementuj jego stan np, o 1
while: plik istnieje
3. Utwórz nowy plik

kombinacji jest wiele, a wszystko zależy od potrzeb
b4rt3kk
Dziękuję za odpowiedź, to mi pomogło. smile.gif
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.