【问题标题】:What is the Win32 API function to use to delete a folder?用于删除文件夹的 Win32 API 函数是什么?
【发布时间】:2010-09-17 19:45:07
【问题描述】:

用于以编程方式删除文件和文件夹的 Win32 API 有哪些?

编辑

DeleteFile 和 RemoveDirectory 是我想要的。 然而,对于这个项目,我最终使用了SHFileOperation。 我发现 CodeGuru 的 sample code 很有帮助。

【问题讨论】:

    标签: winapi


    【解决方案1】:

    我想你想要DeleteFile 和RemoveDirectory

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        有两种方法可以解决这个问题。一种是通过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 初始化来添加反馈和提示 - 请仔细阅读它。

        【讨论】:

        • 我试过了,但没有用。原因 - 参数“dir”必须以双空终止。修复此问题后,它起作用了。见msdn.microsoft.com/en-us/library/bb759795%28v=VS.85%29.aspx。
        • 我接受了 uvgroovy 的建议,并在下面粘贴了一个预煮好的 sn-p。
        • 您可以使用 NULL 代替 "" 和 FOF_NO_UI 作为标志。
        • 请注意SHFileOperation 不支持长路径。 WinRT 也不支持它。
        • Hatcat 的示例代码有问题。文档非常明确:'dir' 必须以两个空值结尾,因为它不一定是单个目录名称。它是以 nul 结尾的目录名称的 nul 结尾串联。 Mark Lakata 的示例代码是正确的。
        【解决方案4】:

        见上面 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
        【解决方案5】:
            /* 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);
                    }
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 这个问题对请求 Win32 API 很清楚。此外,没有迹象表明编程语言是 C++。你如何使用德尔福的boost::filesystem?还是 Visual Basic?还是 C#?但是他们可以很好地调用 Win32 函数。
          • 我知道他们询问了有关 Win32 API 的问题,这就是为什么我添加了“如果您愿意使用第三方库”这一行。虽然我假设 C++ 很好,但我已经修改了我的答案以提及这一点。
          • boost 确实在后台使用了 windows api,并且由于我同时使用了 boost 和 winapi,所以这比某些 shell 操作方式更容易
          猜你喜欢
          • 1970-01-01
          • 2021-10-14
          • 1970-01-01
          • 1970-01-01
          • 2012-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多