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