Ho un problema strano con il mio php. Ogni volta che provo a spostare un file con rename(), non solo il file non viene spostato, ma anche la directory in cui deve essere copiato viene cancellata, insieme a tutti i file al suo interno. Il codice originale è:Comportamento strano di rinomina() in PHP
rename('temp.odt', 'tmp/report.odt');
ma ho già provato altri delimitatori di percorso come
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');
tutto inutile. Il codice proviene da un modulo di terze parti che viene utilizzato nel sistema su cui sto lavorando.
Punti ben controllati:
- Il file 'temp.odt' esiste nella directory corrente;
- La directory "tmp" esiste e ci sono diversi file al suo interno. Inoltre non è di sola lettura.
- Il file di destinazione non esiste già (il nome del file effettivo ha un timestamp, ho ridotto qui per semplicità)
Dopo l'esecuzione di rinominare(), il file 'temp.odt' è intatto nel suo originale posizione, mentre la cartella 'tmp' è svanita così come tutto al suo interno. Viene emesso il seguente avviso:
(!) Avviso: rinomina (temp.odt, tmp \ report.odt) [function.rename]: il sistema non è riuscito a trovare il percorso specificato *. (Codice: 3) in C: \ wamp \ www \ Zaiko \ moduli \ mod_deliver.php on line 192
* tradotto dal portoghese
Esecuzione: Apache 2.2.17 con PHP 5.3.5 su Windows XP con NTFS
Montaggio:
Appena trovato la causa del problema. Risulta che il modulo utilizzato dall'applicazione utilizza, a sua volta, una libreria di compressione; questa libreria utilizza una cartella temporanea con esattamente lo stesso nome di quella utilizzata dall'applicazione.
È necessario utilizzare una sorta di cache, che spiegherebbe perché l'errore non è apparso 100% volte.
Problema risolto cambiando il nome della cartella 'tmp' in qualsiasi altra cosa.
Grazie a tutti per il vostro tempo, e mi dispiace per averti disturbato con una cosa così stupida che, come risulta, non aveva assolutamente nulla a che fare con la mia ipotesi iniziale e, di conseguenza, con la domanda formulata.
Cosa succede se si copia il file nella nuova posizione, quindi si elimina l'originale? – nickb
Potresti postare il codice del modulo da qualche parte? Per quanto riguarda i commenti su php.net, altri non hanno questo problema. Bugtracker dice che 'rename' non sovrascrive i file esistenti su WinXP, ma non è lo stesso problema che descrivi. Forse, c'è un codice da qualche parte che ripulisce la directory 'tmp'? –
Potrebbe essere che l'handle del file (per il file originale) non sia stato rilasciato quando viene chiamato rename()? Viste le caratteristiche della macchina su cui è in esecuzione questo progetto, sono propenso a pensare che sia questo il problema. –