【问题标题】:C/C++ Copy file with automatic recursive folder/directory creation具有自动递归文件夹/目录创建的 C/C++ 复制文件
【发布时间】:2009-12-21 07:28:30
【问题描述】:

在 Win32 API 中,有 CopyFile 字面上复制文件。但是,此 API 不会创建文件夹。例如,我想将C:\Data\output.txt 复制到D:\Temp\Data\output.txt。但是,目标文件夹 D:\TempD:\Temp\Data' 不存在。在这种情况下,这个 API 就失败了。

是否有一个方便的 API 可以自动递归地在副本上创建目录结构?当然,我可以制作这样的功能,但我希望有人已经制作了这个功能。

【问题讨论】:

    标签: c++ c winapi file-io


    【解决方案1】:

    SHFileOperation 应该可以解决问题。来自 MSDN:

    复制和移动操作可以指定 没有的目标目录 存在。在这些情况下,系统 尝试创建它们并且通常 显示一个对话框询问用户 如果他们想创建新的 目录。禁止显示此对话框 并创建目录 默默地设置FOF_NOCONFIRMMKDIR 标记fFlags

    【讨论】:

    • 谢谢。 SHFileOperation 创建文件夹结构,但在实际文件复制中出现一些故障。它只是创建了一个名为源文件名的文件夹!无论如何,SHFileOperation + CopyFile 完成了这项工作。
    【解决方案2】:

    您可以使用SHCreateDirectoryEx 获得所需的结果。这是一个例子:

    inline void EnsureDirExists(const std::wstring& fullDirPath)
    {
        HWND hwnd = NULL;
        const SECURITY_ATTRIBUTES *psa = NULL;
        int retval = SHCreateDirectoryEx(hwnd, fullDirPath.c_str(), psa);
        if (retval == ERROR_SUCCESS || retval == ERROR_FILE_EXISTS || retval == ERROR_ALREADY_EXISTS)
        return; //success
    
        throw boost::str(boost::wformat(L"Error accessing directory path: %1%; win32 error code: %2%") 
           % fullDirPath
           % boost::lexical_cast<std::wstring>(retval));
    
        //TODO *djg* must do error handling here, this can fail for permissions and that sort of thing
    }
    

    【讨论】:

    • SHCreateDirectoryEx 已被弃用,但我仍然没有找到像它这样方便的东西!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 2012-06-12
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多