91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

如何用C++ copyfile實現斷點續傳

c++
小樊
84
2024-10-16 19:39:22
欄目: 編程語言

在C++中,你可以使用CopyFile函數來實現文件的復制。為了實現斷點續傳,你需要在復制過程中檢查源文件和目標文件的大小,并從上次中斷的地方繼續復制。以下是一個簡單的示例:

#include <iostream>
#include <windows.h>

bool CopyFileWithResume(const std::wstring& srcFilePath, const std::wstring& destFilePath) {
    // 獲取源文件和目標文件的大小
    DWORD srcFileSize = GetFileSize(srcFilePath.c_str(), nullptr);
    if (srcFileSize == INVALID_FILE_SIZE) {
        std::cerr << "Error: Unable to get the size of the source file." << std::endl;
        return false;
    }

    DWORD destFileSize = GetFileSize(destFilePath.c_str(), nullptr);
    if (destFileSize == INVALID_FILE_SIZE) {
        // 如果目標文件不存在,可以在這里創建它
        // 如果目標文件存在但為空,可以從這里開始復制
    }

    // 打開源文件和目標文件
    HANDLE hSrcFile = CreateFile(srcFilePath.c_str(), GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
    if (hSrcFile == INVALID_HANDLE_VALUE) {
        std::cerr << "Error: Unable to open the source file." << std::endl;
        return false;
    }

    HANDLE hDestFile = CreateFile(destFilePath.c_str(), GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
    if (hDestFile == INVALID_HANDLE_VALUE) {
        CloseHandle(hSrcFile);
        std::cerr << "Error: Unable to open the destination file." << std::endl;
        return false;
    }

    // 將文件指針設置到上次中斷的地方
    if (destFileSize > 0) {
        SetFilePointer(hDestFile, destFileSize, FILE_BEGIN, nullptr);
    }

    // 復制文件內容
    const DWORD bufferSize = 4096;
    BYTE buffer[bufferSize];
    DWORD bytesRead;
    while ((bytesRead = ReadFile(hSrcFile, buffer, bufferSize, &bytesRead, nullptr)) != 0) {
        if (!WriteFile(hDestFile, buffer, bytesRead, &bytesRead, nullptr)) {
            break;
        }
    }

    // 關閉文件句柄
    CloseHandle(hSrcFile);
    CloseHandle(hDestFile);

    return bytesRead == 0;
}

int main() {
    std::wstring srcFilePath = L"C:\\source.txt";
    std::wstring destFilePath = L"C:\\destination.txt";

    if (CopyFileWithResume(srcFilePath, destFilePath)) {
        std::cout << "File copied successfully." << std::endl;
    } else {
        std::cerr << "Error: File copy failed." << std::endl;
    }

    return 0;
}

這個示例中,CopyFileWithResume函數首先獲取源文件和目標文件的大小。如果目標文件不存在或大小為0,它會創建目標文件。然后,它打開源文件和目標文件,并將文件指針設置到上次中斷的地方。最后,它使用一個循環來復制文件內容,直到讀取完所有數據。

0
宁河县| 淄博市| 镇赉县| 和硕县| 朝阳市| 彰化市| 惠来县| 义马市| 黄骅市| 乡城县| 凤城市| 梧州市| 房产| 新建县| 孟连| 北碚区| 额敏县| 丹东市| 资溪县| 东兰县| 衡山县| 虞城县| 汨罗市| 会理县| 甘孜县| 方城县| 黄浦区| 南和县| 宜良县| 德兴市| 土默特左旗| 博罗县| 巴林左旗| 泽普县| 津市市| 行唐县| 潼南县| 瑞昌市| 夏河县| 宝丰县| 花莲市|