溫馨提示×

如何用C++ copyfile實現(xiàn)斷點續(xù)傳

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

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

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

bool CopyFileWithResume(const std::wstring& srcFilePath, const std::wstring& destFilePath) {
    // 獲取源文件和目標(biāo)文件的大小
    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) {
        // 如果目標(biāo)文件不存在,可以在這里創(chuàng)建它
        // 如果目標(biāo)文件存在但為空,可以從這里開始復(fù)制
    }

    // 打開源文件和目標(biāo)文件
    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;
    }

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

    // 復(fù)制文件內(nèi)容
    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;
        }
    }

    // 關(guān)閉文件句柄
    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函數(shù)首先獲取源文件和目標(biāo)文件的大小。如果目標(biāo)文件不存在或大小為0,它會創(chuàng)建目標(biāo)文件。然后,它打開源文件和目標(biāo)文件,并將文件指針設(shè)置到上次中斷的地方。最后,它使用一個循環(huán)來復(fù)制文件內(nèi)容,直到讀取完所有數(shù)據(jù)。

0