#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;
}