在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;
}
相关推荐
捕鲸叉5 分钟前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer10 分钟前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq12 分钟前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
一坨阿亮1 小时前
Linux 使用中的问题
linux·运维
hairenjing11231 小时前
使用 Mac 数据恢复从 iPhoto 图库中恢复照片
windows·stm32·嵌入式硬件·macos·word
青花瓷2 小时前
C++__XCode工程中Debug版本库向Release版本库的切换
c++·xcode
dsywws2 小时前
Linux学习笔记之vim入门
linux·笔记·学习
九鼎科技-Leo3 小时前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
幺零九零零3 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
捕鲸叉3 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式