Reputation: 9050
In Win32 API, there is CopyFile that literally copies a file. However, this API doesn't create folders. For example, I'd like to copy C:\Data\output.txt
to D:\Temp\Data\output.txt
. But, the target folders, D:\Temp
and D:\Temp\Data
', do not exist. In this case, this API just fails.
Is there a handy API that can automatically and recursively create directory structure on copy? Definitely, I can make such function, but I expect someone already made the function.
Upvotes: 5
Views: 12415
Reputation: 21801
You can achieve desired result using SHCreateDirectoryEx. Here is an example:
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
}
Upvotes: 0
Reputation: 11585
SHFileOperation
should do the trick. From MSDN:
Copy and Move operations can specify destination directories that do not exist. In those cases, the system attempts to create them and normally displays a dialog box to ask the user if they want to create the new directory. To suppress this dialog box and have the directories created silently, set the
FOF_NOCONFIRMMKDIR
flag infFlags
.
Upvotes: 6