2009-08-13 34 views
5

Esta pregunta está relacionada con una instalación de Windows de PHP5.Mover un archivo a la Papelera de reciclaje (PHP)

Hacer un archivo unlink() dificulta la recuperación.

En su lugar, me gustaría mover el archivo a la Papelera de reciclaje (sin hacer un exec()).

¿Alguna idea?

Gracias por su ayuda.

+0

Solo una aclaración para simplificar la solución dada. Both * is_file * y * is_array * devuelven un valor booleano (es decir, verdadero o falso). Compararlo con === a verdadero o falso es redundante. Aunque he visto cosas peores, como * $ var = is_array ($ arr)? true: false; * pero aún ... –

Respuesta

7

Esta es la única solución que funciona y es portátil en todas las unidades.

function Recycle($filename) 
{ 
    if (is_file($filename) === true) 
    { 
     $filename = realpath($filename); 
     $recycle = glob(current(explode('\\', $filename, 2)) . '\\RECYCLER\\*', GLOB_ONLYDIR); 

     if (is_array($recycle) === true) 
     { 
      return rename($filename, current($recycle) '\\' . basename($filename)); 
     } 
    } 

    return false; 
} 

archivos borrados se mueven correctamente a por ejemplo:

O:\RECYCLER\S-1-5-21-1715567821-1390067357-1417001333-1003 

restaurar desde la papelera de reciclaje debería ser posible, sin embargo yo no lo he probado.

EDIT: Acabo de actualizar esta función para trabajar con archivos que tienen rutas de acceso relativas.

+0

Hola, gracias por la función. Lamentablemente, no funciona para mí (el archivo desaparece, pero no sé dónde. No está en la carpeta del sistema [UNIDAD]: \ RECICLADOR \\)) :(Parece (corríjame si no lo estoy) que el OS está escribiendo algunos datos en un archivo de sistema cuando movemos el archivo a la "papelera de reciclaje". Tal vez debería hacer un exec() con algún comando de DOS. :) Por cierto, estoy en XP. – Toto

+0

También estoy en XP y esta función funciona bien para mí, el archivo aparece en la Papelera de reciclaje y también puedo verlo. Por ejemplo, si está eliminando un archivo ubicado en C: asegúrese de habilitar "Mostrar carpetas ocultas" y vaya a C: \ RECYCLER \ __ ALGO __ \ el archivo debe estar allí, lo mismo también funciona para otras unidades (comportamiento predeterminado de Windows) . También debería aparecer en la Papelera de reciclaje. –

+0

Necesitaba algo de trabajo en rutas relativas, debería funcionar bien ahora. Dime si todavía no funciona. –

7

¿por qué no acaba de crear una carpeta y ponerle el nombre "Papelera de reciclaje" ... entonces, en lugar de desvincular() ... simplemente mueva los archivos a esta carpeta "Papelera de reciclaje"?

Si desea mover un archivo, use la función rename() php.

Luego, más tarde puede ejecutar un script cron que comprueba el tiempo de los archivos y luego se puede eliminar archivos, digamos, más de 10 días etc.

espero que esto ayude.

+0

De hecho, es el mismo principio. La papelera de reciclaje no es más que un mapa en el que los archivos no se pueden ejecutar. Los archivos "eliminados" aún existen y aún ocupan el mismo espacio en la Papelera de reciclaje. – KdgDev

+0

Sin restauración desde la Papelera de Reciclaje aunque ... –

+2

En mis necesidades específicas, el env. es solo Windows Si los archivos se mueven a la papelera de reciclaje, puedo interactuar mejor con ellos con otras herramientas binarias (WinSCP, Explorer, etc.) ya que se reconocen como archivos reciclados. Una "Papelera de reciclaje" en mi aplicación no me proporcionaría todas estas funciones y tendría que codificar funciones que ya están en el SO. :) – Toto

0

Esto funciona para mí, using MaDdoGs CmdUtils, en Win7 x64, php 5.4.24. También con archivos grandes, nombres de archivo impares, ...

function recycle($filename) 
{ 
    if (!is_file($filename)) 
     return false; 
    system(__DIR__.'/third-party/Recycle.exe -f "'.$filename.'"', $r); 
    return $r; 
} 
Cuestiones relacionadas