使用什么Win32 API函数来删除文件夹?

问题描述 投票:0回答:6

可使用哪些 Win32 API 以编程方式删除文件和文件夹?

编辑

DeleteFile
RemoveDirectory
是我一直在寻找的。 然而,对于这个项目,我最终使用了
SHFileOperation
。 我发现 CodeGuru 上的示例代码很有帮助。

winapi
6个回答
35
投票

有两种方法可以解决这个问题。一种是通过文件服务(使用DeleteFileRemoveDirectory等命令),另一种是通过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 初始化来添加反馈和提示 - 请仔细阅读。


19
投票

我想你想要 DeleteFileRemoveDirectory


16
投票

参见上面 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.
}

9
投票

我相信

DeleteFile
不会将文件发送到回收站。另外,
RemoveDirectory
仅删除空目录。 SHFileOperation 可以让您最大程度地控制删除内容和删除方式,并在需要时显示标准 Windows UI 对话框(例如“准备删除等)。


3
投票
    /* 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);
            }

0
投票

对于C++编程,如果你愿意使用第三方库, boost::文件系统::remove_all(yourPath) 比 SHFileOperation 简单得多。

© www.soinside.com 2019 - 2024. All rights reserved.