winapi - todos - file.delete c#
¿Cuál es la función de la API Win32 para usar para eliminar una carpeta? (6)
Creo que quieres DeleteFile y RemoveDirectory
¿Cuáles son las API de Win32 para usar para eliminar archivos y carpetas de manera programada?
Editar
DeleteFile y RemoveDirectory son lo que estaba buscando. Sin embargo, para este proyecto terminé usando SHFileOperation . Encontré útil el código de muestra en CodeGuru.
Hay dos maneras de abordar esto. Uno es a través de los Servicios de archivos (usando comandos como DeleteFile y RemoveDirectory ) y el otro es a través del Shell de Windows (usando SHFileOperation ). Este último se recomienda si desea eliminar directorios no vacíos o si desea comentarios del estilo del explorador (diálogos de progreso con archivos de vuelo, por ejemplo). La forma más rápida de hacerlo es crear un SHFILEOPSTRUCT , inicializarlo y llamar a 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.
Ver el comentario de uvgroovy 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.
}
/* 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);
}
Para la programación en C ++, si está dispuesto a trabajar con bibliotecas de terceros, boost :: filesystem :: remove_all (yourPath) es mucho más simple que SHFileOperation.
Creo que DeleteFile
no envía el archivo a la Papelera de reciclaje. Además, RemoveDirectory
elimina solo los RemoveDirectory
vacíos. SHFileOperation le daría el mayor control sobre qué y cómo eliminar y mostraría los cuadros de diálogo de la interfaz de usuario de Windows estándar (por ejemplo, "Preparación para eliminar, etc." si es necesario).