2008-10-17 11 views

Respuesta

8

Creo DeleteFile no envía el archivo a la papelera de reciclaje. Además, RemoveDirectory elimina solo los directorios vacíos. SHFileOperation le daría el mayor control sobre qué y cómo eliminar y mostraría los cuadros de diálogo de Windows UI estándar (por ejemplo, "Preparación para eliminar, etc.").

26

Hay dos formas de abordar esto. File Services (usando comandos como DeleteFile y RemoveDirectory) y el otro es a través del Windows Shell (usando SHFileOperation). Este último se recomienda si desea eliminar directorios no vacíos o si desea comentarios del estilo del explorador (diálogo de progreso con archivos de vuelo, ejemplo). La forma más rápida de hacerlo es crear un SHFILEOPSTRUCT, inicializarlo y llamar al SHFileOperation, por lo tanto:

void silently_remove_directory(LPCTSTR dir) // Fully qualified name of the directory being deleted, without trailing backslash 
{ 
    SHFILEOPSTRUCT file_op = { 
     NULL, 
     FO_DELETE, 
     dir, 
     "", 
     FOF_NOCONFIRMATION | 
     FOF_NOERRORUI | 
     FOF_SILENT, 
     false, 
     0, 
     "" }; 
    SHFileOperation(&file_op); 
} 

Esto elimina silenciosamente todo el directorio. Puede agregar retroalimentación e indicaciones variando la inicialización de SHFILEOPSTRUCT, realice una lectura en él.

+5

Intenté esto y no funcionó. El motivo: el parámetro "dir" DEBE tener ** terminación doble nulo **. Después de arreglar esto, funcionó. Consulte http://msdn.microsoft.com/en-us/library/bb759795%28v=VS.85%29.aspx. – uvgroovy

+1

He seguido la sugerencia de uvgroovy y pegué un fragmento precocinado a continuación. –

+0

Puede usar NULL en lugar de "" y FOF_NO_UI para las banderas. – thims

10

Consulte el comentario de uvgroovy más arriba. Necesita 2 nulos al final del campo 'dir'.

int silently_remove_directory(LPCTSTR dir) // Fully qualified name of the directory being deleted, without trailing backslash 
{ 
    int len = strlen(dir) + 2; // required to set 2 nulls at end of argument to SHFileOperation. 
    char* tempdir = (char*) malloc(len); 
    memset(tempdir,0,len); 
    strcpy(tempdir,dir); 

    SHFILEOPSTRUCT file_op = { 
    NULL, 
    FO_DELETE, 
    tempdir, 
    "", 
    FOF_NOCONFIRMATION | 
    FOF_NOERRORUI | 
    FOF_SILENT, 
    false, 
    0, 
    "" }; 
    int ret = SHFileOperation(&file_op); 
    free(tempdir); 
    return ret; // returns 0 on success, non zero on failure. 
} 
2
/* function used to send files and folder to recycle bin in win32 */ 
      int fn_Send_Item_To_RecycleBin(TCHAR newpath[]) 
      {   
      _tcscat_s(newpath, MAX_PATH,_T("|")); 
      TCHAR* Lastptr = _tcsrchr(newpath, _T('|')); 
      *Lastptr = _T('\0');           // Replace last pointer with Null for double null termination 
      SHFILEOPSTRUCT shFileStruct; 
      ZeroMemory(&shFileStruct,sizeof(shFileStruct)); 
      shFileStruct.hwnd=NULL; 
      shFileStruct.wFunc= FO_DELETE; 
      shFileStruct.pFrom= newpath; 
      shFileStruct.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT; 
      return SHFileOperation(&shFileStruct); 
      } 
0

Para la programación C++, si usted está dispuesto a trabajar con bibliotecas de terceros, boost::filesystem::remove_all(yourPath) es mucho más simple que SHFileOperation.

+1

Esta pregunta fue bastante clara sobre la solicitud de una API de Win32. Además, no hay indicación de que el lenguaje de programación sea C++. ¿Cómo se usa 'boost :: filesystem' de Delphi? ¿O Visual Basic? O C#? Pero pueden llamar a las funciones de Win32 sin problemas. –

+0

Reconozco que me preguntaron sobre Win32 API, por eso incluí la línea "si está dispuesto a trabajar con bibliotecas de terceros". Sin embargo, es bueno que yo asuma C++, modifiqué mi respuesta para mencionar eso. – aquirdturtle

Cuestiones relacionadas