Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Rekurencyjna zmiana nazwy pliku
b4rt3kk
post 11.07.2010, 01:55:05
Post #1





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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.


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
Cysiaczek
post 11.07.2010, 03:29:26
Post #2





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
b4rt3kk
post 11.07.2010, 07:37:12
Post #3





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Dziękuję za odpowiedź, to mi pomogło. smile.gif


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.04.2024 - 20:18