【发布时间】:2010-09-17 19:45:07
【问题描述】:
用于以编程方式删除文件和文件夹的 Win32 API 有哪些?
编辑
DeleteFile 和 RemoveDirectory 是我想要的。 然而,对于这个项目,我最终使用了SHFileOperation。 我发现 CodeGuru 的 sample code 很有帮助。
【问题讨论】:
标签: winapi
用于以编程方式删除文件和文件夹的 Win32 API 有哪些?
编辑
DeleteFile 和 RemoveDirectory 是我想要的。 然而,对于这个项目,我最终使用了SHFileOperation。 我发现 CodeGuru 的 sample code 很有帮助。
【问题讨论】:
标签: winapi
我想你想要DeleteFile 和RemoveDirectory
【讨论】:
我相信DeleteFile 不会将文件发送到回收站。此外,RemoveDirectory 仅删除空目录。 SHFileOperation 可让您最大程度地控制删除内容和删除方式,并在需要时显示标准 Windows UI 对话框(例如“准备删除等)。
【讨论】:
有两种方法可以解决这个问题。一种是通过File Services(使用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 初始化来添加反馈和提示 - 请仔细阅读它。
【讨论】:
SHFileOperation 不支持长路径。 WinRT 也不支持它。
见上面 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.
}
【讨论】:
parameter must be set to NULL if it is not used
/* 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 简单得多。
【讨论】:
boost::filesystem?还是 Visual Basic?还是 C#?但是他们可以很好地调用 Win32 函数。