C / C ++ Копировать файл с автоматическим рекурсивным созданием папки / каталога - PullRequest
5 голосов
/ 21 декабря 2009

В Win32 API есть CopyFile , который буквально копирует файл. Однако этот API не создает папки. Например, я хотел бы скопировать C:\Data\output.txt в D:\Temp\Data\output.txt. Но целевые папки D:\Temp и D:\Temp\Data 'не существуют. В этом случае этот API просто не работает.

Существует ли удобный API, который может автоматически и рекурсивно создавать структуру каталогов при копировании? Конечно, я могу сделать такую ​​функцию, но я ожидаю, что кто-то уже сделал эту функцию.

Ответы [ 2 ]

6 голосов
/ 21 декабря 2009

SHFileOperation должны сделать свое дело. Из MSDN:

Операции копирования и перемещения могут указывать каталоги назначения, которые не существовать. В этих случаях система пытается их создать и нормально отображает диалоговое окно, чтобы спросить пользователя если они хотят создать новый каталог. Чтобы подавить это диалоговое окно и каталоги созданы тихо, установите FOF_NOCONFIRMMKDIR флаг fFlags.

0 голосов
/ 27 июля 2010

Вы можете достичь желаемого результата, используя 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...