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