在windows和linux上用c++11实现一个目录下多个文件生成一个文件,一个文件生成多个文件

Windows

allToOne.cpp

复制代码
#include <iostream>
#include <vector>
#include <windows.h>
#include <fstream>

//返回的是文件的名字的容器
std::vector<std::string> listFilesInDirectory(const std::string& path) {
    std::vector<std::string> files;
    HANDLE hFind;
    WIN32_FIND_DATAA ffd;
    std::string searchPath = path + "\\*"; // 在路径末尾添加通配符以搜索所有文件

    hFind = FindFirstFileA(searchPath.c_str(), &ffd);
    if (hFind == INVALID_HANDLE_VALUE) {
        std::cerr << "FindFirstFile failed: " << GetLastError() << std::endl;
        return files;
    }

    do {
        // 跳过目录本身和子目录
        if (!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
            if (strcmp(ffd.cFileName, "allFiles.txt") != 0) {
                files.push_back(ffd.cFileName);
            }
        }
    } while (FindNextFileA(hFind, &ffd) != 0);

    FindClose(hFind);
    return files;
}
//获取文件行数
int getFileLineCount(const std::string& filePath) {
    std::ifstream file(filePath);
    if (!file) {
        std::cout << "Failed to open file: " << filePath << std::endl;
        return 0;
    }

    int lineCount = 0;
    std::string line;
    while (std::getline(file, line)) {
        lineCount++;
    }

    file.close();
    return lineCount;
}
//获取文件内容
std::vector<std::string> getFileContent(const std::string& filePath) {
    std::vector<std::string> content;
    std::ifstream file(filePath,std::ios::app|std::ios::binary|std::ios::out);
    if (!file) {
        std::cout << "Failed to open file: " << filePath << std::endl;
        return content;
    }

    std::string line;
    while (std::getline(file, line)) {
        content.push_back(line);
    }

    file.close();
    return content;
}
//删除文件
bool deleteFile(const std::string& filePath) {
    if (std::remove(filePath.c_str()) != 0) {
        std::cout << "Failed to delete file: " << filePath << std::endl;
        return false;
    }

    std::cout << "File deleted successfully: " << filePath << std::endl;
    return true;
}
//合并文件
void createFiles(const std::string& directory){
    std::ofstream outputFile(directory+"/"+"allFiles.txt");
    std::vector<std::string> a=listFilesInDirectory(directory);
    for (int i = 0; i < a.size(); ++i) {
        outputFile<<a[i]<<std::endl;
        std::string c=directory+"/"+a[i];
        outputFile<<getFileLineCount(c)<<std::endl;
        std::vector<std::string> b=getFileContent(c);
        for (int j = 0; j < b.size(); ++j) {
            outputFile<<b[j]<<std::endl;
        }
        deleteFile(c);
    }
    outputFile.close();
}
int main(){
    std::string a="D:\\ALearn\\work\\oneToAll\\test";
//    std::vector<std::string> b=listFilesInDirectory(a);
//    for (int i = 0; i < b.size(); ++i) {
//        std::cout<<b[i]<<std::endl;
//    }
//std::cout<<getFileLineCount(a+"/"+"1.txt")<<std::endl;
    createFiles(a);
}

oneToAll.cpp

复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
//删除文件
bool deleteFile(const std::string& filePath) {
    if (std::remove(filePath.c_str()) != 0) {
        std::cout << "Failed to delete file: " << filePath << std::endl;
        return false;
    }
    std::cout << "File deleted successfully: " << filePath << std::endl;
    return true;
}
//生成文件
void splitFiles(const std::string& dir) {
    std::string a=dir+"/"+"allFiles.txt";
    std::ifstream file(a);
    if (!file) {
        std::cout << "Failed to open file: " << a << std::endl;
        return;
    }
    std::string line;
    while (std::getline(file, line)) {
        std::string fileName=line;
        std::getline(file, line);
        int count=std::stoi(line);
        std::ofstream outputFile(dir+"/"+fileName);
        for (int i = 0; i < count; ++i) {
            std::getline(file, line);
            outputFile<<line<<std::endl;
        }
        outputFile.close();
        }

   file.close();
    deleteFile(a);
}
int main() {
    std::string a = "D:\\ALearn\\work\\oneToAll\\test";
    splitFiles(a);

    return 0;
}

linux

allToOne.cpp

复制代码
#include <iostream>
#include <vector>
#include <dirent.h>
#include <fstream>
#include <algorithm>

//返回的是文件的名字的容器
std::vector<std::string> listFilesInDirectory(const std::string& directoryPath) {
    std::vector<std::string> files;
    DIR* directory = opendir(directoryPath.c_str());
    if (directory == nullptr) {
        std::cerr << "无法打开目录: " << directoryPath << std::endl;
        return files;
    }

    dirent* entry;
    while ((entry = readdir(directory)) != nullptr) {
        if (entry->d_type == DT_REG) {  // 只获取常规文件
            std::string fileName = entry->d_name;
            if(fileName!="allFiles.txt"){
                files.push_back(fileName);
            }
            
        }
    }

    closedir(directory);
    // 对文件名进行排序
    std::sort(files.begin(), files.end());
    return files;
}
//获取文件行数
int getFileLineCount(const std::string& filePath) {
    std::ifstream file(filePath);
    if (!file) {
        std::cout << "Failed to open file: " << filePath << std::endl;
        return 0;
    }

    int lineCount = 0;
    std::string line;
    while (std::getline(file, line)) {
        lineCount++;
    }

    file.close();
    return lineCount;
}
//获取文件内容
std::vector<std::string> getFileContent(const std::string& filePath) {
    std::vector<std::string> content;
    std::ifstream file(filePath,std::ios::app|std::ios::binary|std::ios::out);
    if (!file) {
        std::cout << "Failed to open file: " << filePath << std::endl;
        return content;
    }

    std::string line;
    while (std::getline(file, line)) {
        content.push_back(line);
    }

    file.close();
    return content;
}
//删除文件
bool deleteFile(const std::string& filePath) {
    if (std::remove(filePath.c_str()) != 0) {
        std::cout << "Failed to delete file: " << filePath << std::endl;
        return false;
    }

    std::cout << "File deleted successfully: " << filePath << std::endl;
    return true;
}
//合并文件
void createFiles(const std::string& directory){
    std::ofstream outputFile(directory+"/"+"allFiles.txt");
    std::vector<std::string> a=listFilesInDirectory(directory);
    for (int i = 0; i < a.size(); ++i) {
        outputFile<<a[i]<<std::endl;
        std::string c=directory+"/"+a[i];
        outputFile<<getFileLineCount(c)<<std::endl;
        std::vector<std::string> b=getFileContent(c);
        for (int j = 0; j < b.size(); ++j) {
            outputFile<<b[j]<<std::endl;
        }
        deleteFile(c);
    }
    outputFile.close();
}
int main(){
    std::string a="/home/xyt/work/vsCode/pro1/3/test";
//    std::vector<std::string> b=listFilesInDirectory(a);
//    for (int i = 0; i < b.size(); ++i) {
//        std::cout<<b[i]<<std::endl;
//    }
// std::cout<<getFileLineCount(a+"/"+"1.txt")<<std::endl;
 createFiles(a);
}

oneToAll.cpp

复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
//删除文件
bool deleteFile(const std::string& filePath) {
    if (std::remove(filePath.c_str()) != 0) {
        std::cout << "Failed to delete file: " << filePath << std::endl;
        return false;
    }
    std::cout << "File deleted successfully: " << filePath << std::endl;
    return true;
}
//生成文件
void splitFiles(const std::string& dir) {
    std::string a=dir+"/"+"allFiles.txt";
    std::ifstream file(a);
    if (!file) {
        std::cout << "Failed to open file: " << a << std::endl;
        return;
    }
    std::string line;
    while (std::getline(file, line)) {
        std::string fileName=line;
        std::getline(file, line);
        int count=std::stoi(line);
        std::ofstream outputFile(dir+"/"+fileName);
        for (int i = 0; i < count; ++i) {
            std::getline(file, line);
            outputFile<<line<<std::endl;
        }
        outputFile.close();
        }

   file.close();
    deleteFile(a);
}
int main() {
    std::string a = "/home/xyt/work/vsCode/pro1/3/test";
    splitFiles(a);

    return 0;
}
相关推荐
三体世界2 小时前
Mysql基本使用语句(一)
linux·开发语言·数据库·c++·sql·mysql·主键
TT-Kun2 小时前
Linux 上手 UDP Socket 程序编写(含完整具体demo)
linux·计算机网络·udp
一川风絮千片雪2 小时前
【环境配置】Linux/Ubuntu24.04 无图形界面安装显卡驱动
linux·运维·服务器
Danileaf_Guo3 小时前
Ubuntu 18.04快速配置WireGuard互联
linux·运维·服务器·ubuntu
快乐就是哈哈哈3 小时前
从零部署 MySQL 数据库:Linux 安装与防火墙策略全解析
linux·mysql
John_ToDebug4 小时前
JS 与 C++ 双向通信实战:基于 WebHostViewListener 的消息处理机制
前端·c++·chrome
koboides4 小时前
我的第一个开源项目-jenkins集成k8s项目
linux·运维·云原生·容器·kubernetes·jenkins
papership4 小时前
【入门级-C++程序设计:11、指针与引用-引 用】
c语言·开发语言·c++·青少年编程
岁忧4 小时前
(LeetCode 每日一题) 1780. 判断一个数字是否可以表示成三的幂的和 (数学、三进制数)
java·c++·算法·leetcode·职场和发展·go
yuxb735 小时前
Ansible 基础到实操笔记
linux·笔记·ansible