在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;
}
相关推荐
SPC的存折5 小时前
1、Redis数据库基础
linux·运维·服务器·数据库·redis·缓存
小疙瘩6 小时前
只是记录自己发布若依分离系统到linux过程中遇到的问题
linux·运维·服务器
我是伪码农7 小时前
外卖餐具智能推荐
linux·服务器·前端
透明的玻璃杯8 小时前
window环境下使用类似tail的命令跟踪滚动的日志
windows
私人珍藏库8 小时前
【windows】跨平台 Android 刷机Root工具箱
android·windows·工具·刷机·软件·多功能
皮皮林5518 小时前
强烈建议大家使用 Linux 做开发?
linux
IMPYLH8 小时前
Linux 的 od 命令
linux·运维·服务器·bash
And_Ii8 小时前
LCR 168. 丑数
c++
Kk.08029 小时前
Linux(十一)fork实例练习、文件操作示例及相关面试题目分享
linux·运维·算法
CoderMeijun9 小时前
C++ 时间处理与格式化输出:从 Linux 时间函数到 Timestamp 封装
c++·printf·stringstream·时间处理·clock_gettime