2012-02-13 27 views
6

Mam dziwny problem z moim php. Ilekroć próbuję przenieść plik z nazwą(), nie tylko plik nie zostanie przeniesiony, ale także katalog, do którego ma zostać skopiowany, zostanie usunięty wraz z wszystkimi plikami w nim. Oryginalny kod jest:Dziwne zachowanie zmiany nazwy() w PHP

rename('temp.odt', 'tmp/report.odt'); 

ale ja już próbowałem innych ograniczniki ścieżki jak

rename('temp.odt', 'tmp\report.odt'); 

rename('temp.odt', 'tmp\\report.odt'); 

rename('temp.odt', 'tmp' . DIRECTORY_SEPARATOR . 'report.odt'); 

rename('C:\wamp\www\zaiko\temp.odt', 'C:\wamp\www\zaiko\tmp\report.odt'); 

wszystkich bezskutecznie. Kod pochodzi z modułu zewnętrznego, który jest używany w systemie, nad którym pracuję.

Punkty dobrze sprawdzone:

  1. Plik 'temp.odt' nie istnieje w bieżącym katalogu;
  2. Katalog "tmp" istnieje i jest w nim kilka plików. Również nie jest tylko do odczytu.
  3. Plik docelowy nie istnieje (rzeczywista nazwa pliku zawiera znacznik czasu, ja go tutaj zmniejszona dla uproszczenia)

Po uruchomieniu rename(), przy czym „temp.odt” plik jest nienaruszony w swoim pierwotnym lokalizacja, a folder "tmp" to zniknął, a także wszystko, co znajduje się w środku. Wydano następujące ostrzeżenie:

(!) Ostrzeżenie: zmień nazwę (temp.odt, tmp \ report.odt) [function.rename]: System nie może znaleźć określonej ścieżki *. (Kod: 3) w C: \ wamp \ www \ Zaiko \ modules \ mod_deliver.php on line 192

* tłumaczone z portugalskim

Bieg: Apache 2.2.17 PHP 5.3.5 w systemie Windows XP z dodatkiem NTFS


Montaż:

Wystarczy znaleźć przyczynę problemu. Okazuje się, że moduł używany przez aplikację używa z kolei biblioteki kompresji; ta biblioteka używa folderu tymczasowego o dokładnie takiej samej nazwie jak ta używana przez aplikację.

Musi używać jakiejś pamięci podręcznej, która wyjaśniałaby, dlaczego błąd nie pojawił się 100% razy.

Problem rozwiązany przez zmianę nazwy folderu "tmp" na cokolwiek innego.

Dziękuję wszystkim za poświęcony czas i przepraszam, że zawracam sobie głowę taką głupią rzeczą, która, jak się okazuje, nie miała absolutnie nic wspólnego z moim początkowym domysłem i, w konsekwencji, z sformułowanym pytaniem.

+0

Co stanie się, gdy skopiujesz plik do nowej lokalizacji, a następnie usuniesz oryginał? – nickb

+0

Czy możesz gdzieś umieścić kod modułu? Jeśli chodzi o komentarze na php.net, inne nie mają tego problemu. Bugtracker mówi, że 'rename' nie zastępuje istniejących plików na WinXP, ale to nie jest ten sam problem, co opisujesz. A może jest jakiś kod, który czyści katalog 'tmp'? –

+0

Czy to możliwe, że uchwyt pliku (dla oryginalnego pliku) nie został zwolniony podczas wywoływania metody name()? Biorąc pod uwagę charakterystykę maszyny, na której działa ten projekt, jestem skłonny sądzić, że to jest problem. –

Odpowiedz

4

Przykładem na PHP.net mówi dokładnie, co zrobić - używać ścieżka główna do akt - normalnie to można dostać za pomocą $_SERVER['DOCUMENT_ROOT'] (ale to tylko idzie do katalogu htdocs/public_html - trzeba podać resztę) lub ręcznie wpisując ścieżkę (ale staraj się tego uniknąć).

<?php 
rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt"); 
?> 

na oko, co następuje powinien działać (zakładając, że jest to ścieżka) - ten sprawdza również, że plik rzeczywiście istnieje, więc może zostać zmieniona - trzeba się upewnić, że tmp/ faktycznie istnieje w pierwszej kolejności , ale dostaniesz błąd wychodziły jeśli nie zrobił:

<?php 

$root = getcwd().DIRECTORY_SEPARATOR; // Obtain the current working dir 
$srcpath = $root."temp.odt";   // The file you want to rename 
$destpath = $root."tmp/report.odt"; // Where you want to rename the file to 

// make sure file exists and its movable 
if(is_writable($srcpath)){ 
    // if it exists, rename it 
    rename($srcpath, $dstpath); 
    echo "File was renamed!"; 
} else { 
    echo "It seems that the specified file doesn't exist!"; 
} 
?> 

Byłaś ucieczki znaków za pomocą backslashy - zawsze używać ukośników (wiem, że to jest w jednym cytatem, który jest ok, ale jeśli używasz podwójnego cudzysłowu, a potem zastanawiałbyś się, co poszło nie tak!

+0

Ukośniki w ciągach o pojedynczych cudzysłowach mogą uciec tylko od nich samych ('\\') lub pojedynczego cudzysłowu '\ ''. Ale ukośniki są preferowane, tak. –

+0

Próbowałem wszystkiego. Przy wskazanej konfiguracji działa tylko czasami. –

+0

@AndrewD. Tak - dobra uwaga! – MrJ