windows - Weird opførsel af omdøb () i PHP

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et underligt problem med min php. Når jeg forsøger at flytte en fil med omdøb (), bliver ikke kun filen flyttet, men også den mappe, som den skal kopieres til, slettet sammen med alle filer i den. Den oprindelige kode er:


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


men jeg har allerede forsøgt andre vejafgrænsere som


rename('temp.odt', 'tmp
eport.odt');

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

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

rename('C:wampwwwzaiko	emp.odt', 'C:wampwwwzaiko	mp
eport.odt');


alt forgæves. Koden kommer fra et 3-delt modul, som bruges i systemet jeg arbejder på.


Point godt kontrolleret:



  1. Filen 'temp.odt' findes i den aktuelle mappe;

  2. Mappen 'tmp' eksisterer, og der er flere filer i den. Også det er ikke læst.

  3. Målfilen eksisterer ikke allerede (det faktiske filnavn har en tidsstempel, jeg reducerede det her for enkelhed)



Efter at have kørt omdøb (), er filen 'temp.odt' intakt i sin oprindelige placering, mens mappen 'tmp' er forsvundet såvel som alt inde i den. Følgende advarsel udstedes:


(!) Advarsel: omdøb (temp.odt, tmp \ report.odt) [[function.rename]]: Systemet kunne ikke finde den angivne sti *. (Kode: 3) i C: \ wamp \ www \ zaiko \ modules \ mod\_deliver.php på linje 192


* oversat fra portugisisk


Kører: Apache 2.2.17 med PHP 5.3.5 på Windows XP med NTFS





Redigering:


Netop fundet årsagen til problemet. Det viser sig, at modulet, der anvendes af applikationen, bruger i sin tur et komprimeringsbibliotek; dette bibliotek bruger en midlertidig mappe med nøjagtig samme navn som det, der anvendes af applikationen.


Det skal bruge en slags cache, hvilket ville forklare, hvorfor fejlen ikke viste sig 100\% gange.


Problemet løses ved at ændre navnet på 'tmp' -mappen til noget andet.


Mange tak for din tid, og undskyld for at forstyrre dig med en sådan dum ting, der som det viser sig, havde absolut ingenting at gøre med mit første gæt og følgelig med det formulerede spørgsmål.

Bedste reference


Eksemplet på PHP.net fortæller dig præcis hvad man skal gøre - brug ROOT PATH til filen - normalt kan man få det ved at bruge $\_SERVER['DOCUMENT\_ROOT'] (men det går kun til htdocs/public\_html-biblioteket - du skal angive hvile) eller ved manuelt at skrive stien i (men forsøg at undgå dette). [7]


<?php
rename("/tmp/tmp\_file.txt", "/home/user/login/docs/my\_file.txt");
?>


På et gæt skal følgende arbejde (hvis dette er din vej) - dette kontrollerer også, at din fil faktisk eksisterer, så det kan omdøbes - du skal sørge for, at tmp/ faktisk eksisterer i første omgang, men du vil få en fejl, der popper ud, hvis det ikke 't:


<?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!";
}
?>


Du var undslippe tegn ved hjælp af tilbageslag - brug altid fremad skråstreger (jeg ved, at dette er inden for et enkelt citat, hvilket er ok, men hvis du bruger dobbelt citat så ville du spekulerer på, hvad der er gået galt)!