可使用哪些 Win32 API 以编程方式删除文件和文件夹?
编辑
DeleteFile
和RemoveDirectory
是我一直在寻找的。
然而,对于这个项目,我最终使用了SHFileOperation
。
我发现 CodeGuru 上的示例代码很有帮助。
有两种方法可以解决这个问题。一种是通过文件服务(使用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 初始化来添加反馈和提示 - 请仔细阅读。
我想你想要 DeleteFile 和 RemoveDirectory
参见上面 uvgroovy 的评论。您需要在“dir”字段末尾有 2 个空值。
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,
NULL,
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::文件系统::remove_all(yourPath) 比 SHFileOperation 简单得多。