用于以编程方式删除文件和文件夹的Win32 API是什么?
修改
我正在寻找DeleteFile和RemoveDirectory。 但是,对于这个项目,我最终使用SHFileOperation。 我发现CodeGuru上的sample code很有帮助。
答案 0 :(得分:29)
有两种方法可以解决这个问题。一个是通过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初始化来添加反馈和提示 - 请阅读它。
答案 1 :(得分:16)
我认为你想要DeleteFile和RemoveDirectory
答案 2 :(得分:12)
请参阅uvgroovy上面的评论。
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.
}
答案 3 :(得分:9)
我相信DeleteFile
不会将文件发送到回收站。此外,RemoveDirectory
仅删除空目录。 SHFileOperation可以让您最大程度地控制删除内容和删除内容,并在需要时显示标准的Windows UI对话框(例如“准备删除等”)。
答案 4 :(得分: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);
}
答案 5 :(得分:1)
对于C ++编程,如果您愿意使用第三方库, boost::filesystem::remove_all(yourPath) 比SHFileOperation简单得多。