在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;
}
相关推荐
九鼎科技-Leo1 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
机器视觉知识推荐、就业指导1 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
朝九晚五ฺ2 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream2 小时前
Linux的桌面
linux
xiaozhiwise2 小时前
Makefile 之 自动化变量
linux
Yang.993 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
熬夜学编程的小王3 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
zz40_3 小时前
C++自己写类 和 运算符重载函数
c++
我不瘦但很逗3 小时前
Windows下使用DBeaver连接云数据库(MySQL)
数据库·windows