#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
// 分割文件
void splitFile(const string& inputFileName, size_t chunkSize) {
ifstream inputFile(inputFileName, ios::binary);
if (!inputFile) {
cerr << "无法打开输入文件: " << inputFileName << endl;
return;
}
vector<char> buffer(chunkSize);
int partNumber = 1;
// 提取文件扩展名
size_t dotPos = inputFileName.find_last_of('.');
string fileExtension = (dotPos != string::npos) ? inputFileName.substr(dotPos) : "";
string baseName = (dotPos != string::npos) ? inputFileName.substr(0, dotPos) : inputFileName;
cout << "您选择将文件按照每个 " << chunkSize / (1024 * 1024) << "MB 的大小进行分割。" << endl;
cout << "程序会将文件分割成 " << baseName << "X" << fileExtension << " 的格式。" << endl;
while (inputFile) {
inputFile.read(buffer.data(), chunkSize);
streamsize bytesRead = inputFile.gcount();
if (bytesRead > 0) {
string outputFileName = baseName + to_string(partNumber) + fileExtension;
ofstream outputFile(outputFileName, ios::binary);
if (!outputFile) {
cerr << "无法创建输出文件: " << outputFileName << endl;
break;
}
outputFile.write(buffer.data(), bytesRead);
outputFile.close();
partNumber++;
}
}
inputFile.close();
cout << "文件分割完成,共分割成 " << partNumber - 1 << " 个文件。" << endl;
}
// 合并文件
void mergeFiles(const string& baseFileName) {
// 提取文件扩展名
size_t dotPos = baseFileName.find_last_of('.');
string fileExtension = (dotPos != string::npos) ? baseFileName.substr(dotPos) : "";
string baseNameWithoutExt = (dotPos != string::npos) ? baseFileName.substr(0, dotPos) : baseFileName;
ofstream outputFile(baseFileName, ios::binary);
if (!outputFile) {
cerr << "无法打开输出文件: " << baseFileName << endl;
return;
}
cout << "开始合并以 " << baseNameWithoutExt << "X" << fileExtension << " 格式的文件。" << endl;
int partNumber = 1;
int mergedFileCount = 0;
while (true) {
string partFileName = baseNameWithoutExt + to_string(partNumber) + fileExtension;
ifstream partFile(partFileName, ios::binary);
if (!partFile) {
// 如果无法打开文件,说明已经没有更多的分割文件了
break;
}
// 读取分割文件的内容并写入输出文件
outputFile << partFile.rdbuf();
partFile.close();
partNumber++;
mergedFileCount++;
}
outputFile.close();
cout << "文件合并完成,共合并了 " << mergedFileCount << " 个文件。" << endl;
}
int main() {
int choice;
cout << "欢迎使用文件分割与合并工具!" << endl;
cout << "请选择操作:" << endl;
cout << "1. 分割文件" << endl;
cout << "2. 合并文件" << endl;
cin >> choice;
if (choice == 1) {
string inputFileName;
size_t chunkSize;
cout << "请输入要分割的文件的路径: ";
cin >> inputFileName;
cout << "请输入每个分割文件的大小(单位:MB): ";
cin >> chunkSize;
chunkSize *= 1024 * 1024; // 将 MB 转换为字节
splitFile(inputFileName, chunkSize);
} else if (choice == 2) {
string baseFileName;
cout << "请输入原始文件的基本名称(包含文件扩展名): ";
cin >> baseFileName;
mergeFiles(baseFileName);
} else {
cout << "无效的选择,请输入 1 或 2。" << endl;
}
return 0;
}