Tengo un problema extraño con mi php. Cada vez que intento mover un archivo con rename(), no solo no se mueve el archivo, sino que también se elimina el directorio al que se debe copiar, junto con todos los archivos que contiene. El código original es:Comportamiento extraño de renombrar() en PHP
rename('temp.odt', 'tmp/report.odt');
pero ya he probado otros delimitadores de ruta como
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');
todo fue en vano. El código proviene de un módulo de terceros que se utiliza en el sistema en el que estoy trabajando.
Puntos así verificado:
- El archivo 'temp.odt' no existe en el directorio actual;
- El directorio 'tmp' existe y hay varios archivos en él. Además, no es de solo lectura.
- no existe el archivo de destino (el nombre real del archivo tiene una marca de tiempo, reduje aquí por simplicidad)
Después de ejecutar renombrar(), el archivo 'temp.odt' está intacto en su forma original ubicación, mientras que la carpeta 'tmp' es desaparecido, así como todo lo que hay dentro. Se emite la siguiente advertencia:
(!) Advertencia: cambiar el nombre (temp.odt, tmp \ report.odt) [función.nombre]: El sistema no pudo encontrar la ruta especificada *. (Código: 3) en C: \ wamp \ www \ Zaiko \ modules \ mod_deliver.php en la línea 192
* Traducido del portugués
de reproducción: Apache 2.2.17 con PHP 5.3.5 en Windows XP con NTFS
Edición:
Sólo se encontró la causa del problema. Resulta que el módulo utilizado por la aplicación utiliza, a su vez, una biblioteca de compresión; esta biblioteca utiliza una carpeta temporal con exactamente el mismo nombre que la utilizada por la aplicación.
Debe usar algún tipo de caché, lo que explicaría por qué el error no apareció el 100%.
Problema resuelto al cambiar el nombre de la carpeta 'tmp' a cualquier otra cosa.
Gracias a todos por su tiempo, y lo siento por molestarlo con una cosa tan estúpida que, como resultado, no tuvo absolutamente nada que ver con mi conjetura inicial y, en consecuencia, con la pregunta formulada.
¿Qué sucede si copia el archivo en la nueva ubicación y luego elimina el original? – nickb
¿Podría publicar el código del módulo en alguna parte? En cuanto a los comentarios en php.net, otros no tienen este problema. Bugtracker dice que 'rename' no sobrescribe los archivos existentes en WinXP, pero no es el mismo problema que usted describe. Tal vez, hay un código en alguna parte que limpia el directorio 'tmp'? –
¿Podría ser que el manejador de archivo (para el archivo original) no se haya liberado cuando se llama a renombrar()? Dadas las características de la máquina en la que se ejecuta este proyecto, me inclino a pensar que ese es el problema. –