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:
- Plik 'temp.odt' nie istnieje w bieżącym katalogu;
- Katalog "tmp" istnieje i jest w nim kilka plików. Również nie jest tylko do odczytu.
- 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.
Co stanie się, gdy skopiujesz plik do nowej lokalizacji, a następnie usuniesz oryginał? – nickb
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'? –
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. –