C/C++ Копировать файл с автоматическим рекурсивным созданием папки/каталога

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

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


person minjang    schedule 21.12.2009    source источник


Ответы (2)


SHFileOperation должно помочь. Из MSDN:

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

person Aaron Klotz    schedule 21.12.2009
comment
Спасибо. SHFileOperation создает структуры папок, но некоторые сбои в копировании файлов. Он просто создал папку с именем имени исходного файла! Так или иначе, SHFileOperation + CopyFile сделали свое дело. - person minjang; 21.12.2009

Вы можете добиться желаемого результата, используя 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
}
person Dustin Getz    schedule 27.07.2010
comment
SHCreateDirectoryEx устарел, но ничего подобного я так и не нашел! - person sergiol; 19.05.2017