C/C++ Salin file dengan pembuatan folder/direktori rekursif otomatis

Di Win32 API, ada CopyFile yang secara harfiah menyalin file. Namun, API ini tidak membuat folder. Misalnya, saya ingin menyalin C:\Data\output.txt ke D:\Temp\Data\output.txt. Namun, folder target, D:\Temp dan D:\Temp\Data', tidak ada. Dalam hal ini, API ini gagal.

Apakah ada API praktis yang dapat secara otomatis dan rekursif membuat struktur direktori pada salinan? Pastinya saya bisa membuat fungsi seperti itu, tapi saya harap sudah ada yang membuat fungsi tersebut.


person minjang    schedule 21.12.2009    source sumber


Jawaban (2)


SHFileOperation seharusnya berhasil. Dari MSDN:

Operasi Salin dan Pindahkan dapat menentukan direktori tujuan yang tidak ada. Dalam kasus tersebut, sistem akan mencoba membuatnya dan biasanya menampilkan kotak dialog untuk menanyakan pengguna apakah mereka ingin membuat direktori baru. Untuk menyembunyikan kotak dialog ini dan membuat direktori dibuat secara diam-diam, setel tanda FOF_NOCONFIRMMKDIR di fFlags.

person Aaron Klotz    schedule 21.12.2009
comment
Terima kasih. SHFileOperation membuat struktur folder, tetapi ada beberapa kesalahan pada salinan file sebenarnya. Itu baru saja membuat folder dengan nama nama file sumber! Bagaimanapun, SHFileOperation + CopyFile berhasil. - person minjang; 21.12.2009

Anda dapat mencapai hasil yang diinginkan menggunakan SHCreateDirectoryEx. Berikut ini contohnya:

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 sudah tidak digunakan lagi, tetapi saya masih belum menemukan sesuatu yang nyaman seperti itu! - person sergiol; 19.05.2017