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

C++ C/C++;使用自动递归文件夹/目录创建复制文件,c++,c,winapi,file-io,C++,C,Winapi,File Io,在Win32 API中,有一种复制文件的方法。但是,此API不创建文件夹。例如,我想将C:\Data\output.txt复制到d:\Temp\Data\output.txt。但是,目标文件夹D:\Temp和D:\Temp\Data”不存在。在这种情况下,这个API就失败了 是否有一个方便的API可以自动递归地在副本上创建目录结构?当然,我可以做这样的函数,但我希望已经有人做了这个函数。应该做这个。从MSDN: 复制和移动操作可以指定 目标目录不包含 存在。在这些情况下,系统 尝试创建它们并正常

在Win32 API中,有一种复制文件的方法。但是,此API不创建文件夹。例如,我想将
C:\Data\output.txt
复制到
d:\Temp\Data\output.txt
。但是,目标文件夹
D:\Temp
D:\Temp\Data
”不存在。在这种情况下,这个API就失败了

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

应该做这个。从MSDN:

复制和移动操作可以指定 目标目录不包含 存在。在这些情况下,系统 尝试创建它们并正常运行 显示一个对话框以询问用户 如果他们想创建新的 目录取消显示此对话框的步骤 并创建目录 以静默方式设置FOF_noconfirmkdir的

fFlags中的标志


您可以通过使用来实现所需的结果。以下是一个例子:

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
}
inline void EnsureDirExists(const std::wstring&fullDirPath)
{
HWND HWND=NULL;
const SECURITY_ATTRIBUTES*psa=NULL;
int-retval=SHCreateDirectoryEx(hwnd,fullDirPath.c_str(),psa);
如果(retval==ERROR|u SUCCESS | retval==ERROR_FILE_存在| retval==ERROR_已经存在)
return;//成功
抛出boost::str(boost::wformat(L“访问目录路径时出错:%1%;win32错误代码:%2%”)
%全径
%词法转换(retval);
//TODO*djg*必须在这里进行错误处理,这可能会导致权限失败之类的事情
}

谢谢
SHFileOperation
创建文件夹结构,但实际文件复制中存在一些问题。它刚刚创建了一个名为源文件名的文件夹!不管怎样,
SHFileOperation
+
CopyFile
完成了这项工作。
SHCreateDirectoryEx
已被弃用,但我仍然没有找到像它这样方便的方法!