在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,它會創建目標文件。然后,它打開源文件和目標文件,并將文件指針設置到上次中斷的地方。最后,它使用一個循環來復制文件內容,直到讀取完所有數據。