C/C++自动递归创建文件夹/目录的复制文件

5
在Win32 API中,有一个名为CopyFile的API可以复制文件。然而,这个API不会创建文件夹。例如,我想把C:\Data\output.txt复制到D:\Temp\Data\output.txt。但是,目标文件夹D:\TempD:\Temp\Data并不存在。在这种情况下,这个API就会失败。
是否有一个方便的API可以在复制时自动递归创建目录结构呢?当然,我可以编写这样的函数,但是我希望已经有人编写了这样的函数。
2个回答

6

SHFileOperation可以解决问题。根据MSDN的描述:

复制和移动操作可以指定不存在的目标目录。在这些情况下,系统会尝试创建它们,并通常显示一个对话框询问用户是否要创建新目录。为了抑制此对话框并使目录静默创建,请在fFlags中设置FOF_NOCONFIRMMKDIR标志。


1
谢谢。SHFileOperation 可以创建文件夹结构,但是在实际文件复制中可能会出现一些小问题。它只会创建一个与源文件名相同的文件夹!无论如何,使用 SHFileOperation + CopyFile 可以完成任务。 - minjang

0

您可以使用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已被弃用,但我仍然没有找到像它一样方便的东西! - sergiol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接