Какие API-интерфейсы Win32 можно использовать для программного удаления файлов и папок?
Edit
DeleteFile и RemoveDirectory - это то, что я искал, Однако для этого проекта я закончил использование SHFileOperation. Я нашел пример кода в CodeGuru.
Какие API-интерфейсы Win32 можно использовать для программного удаления файлов и папок?
Edit
DeleteFile и RemoveDirectory - это то, что я искал, Однако для этого проекта я закончил использование SHFileOperation. Я нашел пример кода в CodeGuru.
Я думаю, вы хотите DeleteFile и RemoveDirectory
Есть два способа приблизиться к этому. Один через Файловые службы (с использованием таких команд, как DeleteFile и RemoveDirectory), а другой - через Windows Shell ( используя SHFileOperation). Последнее рекомендуется, если вы хотите удалить непустые каталоги или если хотите получить обратную связь в стиле браузера (например, диалоги прогресса с летающими файлами). Самый быстрый способ сделать это - создать SHFILEOPSTRUCT, инициализировать его и вызвать SHFileOperation, таким образом:
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);
}
Это тихо удаляет весь каталог. Вы можете добавить отзывы и подсказки, изменив инициализацию SHFILEOPSTRUCT - прочитайте на нем.
См. комментарий uvgroovy выше. Вам нужно 2 нули в конце поля "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.
}
Я считаю, что DeleteFile
не отправляет файл в Корзину. Кроме того, RemoveDirectory
удаляет только пустые директории. SHFileOperation даст вам максимальный контроль над тем, что и как удалить, и отобразит стандартные диалоговые окна Windows UI (например, "Подготовка к удалению и т.д." ) при необходимости.
/* 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);
}
Для программирования на C++, если вы готовы работать со сторонними библиотеками, boost:: filesystem:: remove_all (yourPath) намного проще, чем SHFileOperation.