在Win32 API中,有CopyFile從字面上複製文件。但是,此API不會創建文件夾。例如,我想將C:\Data\output.txt
複製到D:\Temp\Data\output.txt
。但是,目標文件夾D:\Temp
和D:\Temp\Data
'不存在。在這種情況下,這個API只是失敗。帶有自動遞歸文件夾/目錄創建的C/C++複製文件
是否有一個方便的API,可以自動遞歸創建複製目錄結構?當然,我可以做出這樣的功能,但我希望有人已經做出了這個功能。
在Win32 API中,有CopyFile從字面上複製文件。但是,此API不會創建文件夾。例如,我想將C:\Data\output.txt
複製到D:\Temp\Data\output.txt
。但是,目標文件夾D:\Temp
和D:\Temp\Data
'不存在。在這種情況下,這個API只是失敗。帶有自動遞歸文件夾/目錄創建的C/C++複製文件
是否有一個方便的API,可以自動遞歸創建複製目錄結構?當然,我可以做出這樣的功能,但我希望有人已經做出了這個功能。
SHFileOperation
應該這樣做。從MSDN:
複製和移動操作可以指定 目標目錄不存在 。在這些情況下,系統 會嘗試創建它們,通常 會顯示一個對話框,以詢問用戶 是否要創建新的 目錄。要禁止此對話框 並且以靜默方式創建目錄 ,請在
fFlags
中設置FOF_NOCONFIRMMKDIR
標誌。
您可以使用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 2017-05-19 18:19:55
謝謝。 'SHFileOperation'創建文件夾結構,但是在實際的文件拷貝中有一些小故障。它只是創建了一個名稱爲源文件名的文件夾!無論如何,'SHFileOperation' +'CopyFile'完成了這項工作。 – minjang 2009-12-21 08:09:52