#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <io.h>
#include <direct.h>
// UTF-8 BOM
const std::vector<unsigned char> UTF8_BOM = { 0xEF, 0xBB, 0xBF };
bool addBOMToFile(const std::string& srcFile, const std::string& destFile) {
// 打开源文件进行读取
std::ifstream inputFile(srcFile, std::ios::binary);
if (!inputFile.is_open()) {
std::cerr << "Error opening source file: " << srcFile << std::endl;
return false;
}
// 读取文件内容
std::vector<char> fileContent((std::istreambuf_iterator<char>(inputFile)),
std::istreambuf_iterator<char>());
inputFile.close();
// 检查文件是否已经包含 BOM
if (fileContent.size() >= 3 &&
static_cast<unsigned char>(fileContent[0]) == UTF8_BOM[0] &&
static_cast<unsigned char>(fileContent[1]) == UTF8_BOM[1] &&
static_cast<unsigned char>(fileContent[2]) == UTF8_BOM[2]) {
std::cout << "BOM already present in file: " << srcFile << std::endl;
return true;
}
// 打开目标文件进行写入
std::ofstream outputFile(destFile, std::ios::binary);
if (!outputFile.is_open()) {
std::cerr << "Error opening destination file: " << destFile << std::endl;
return false;
}
// 写入 BOM 到目标文件
outputFile.write(reinterpret_cast<const char*>(UTF8_BOM.data()), UTF8_BOM.size());
// 写入源文件内容到目标文件
outputFile.write(fileContent.data(), fileContent.size());
outputFile.close();
std::cout << "Added BOM to file: " << destFile << std::endl;
return true;
}
void convertFilesWithBOM(const std::string& rootDir) {
long hFile;
struct _finddata_t fileData;
std::string searchPath = rootDir + "\\*.*";
if ((hFile = _findfirst(searchPath.c_str(), &fileData)) != -1) {
do {
if (fileData.attrib & _A_SUBDIR) {
if (strcmp(fileData.name, ".") != 0 && strcmp(fileData.name, "..") != 0) {
std::string subDir = rootDir + "\\" + fileData.name;
convertFilesWithBOM(subDir);
}
}
else {
std::string filePath = rootDir + "\\" + fileData.name;
std::string fileExtension = filePath.substr(filePath.find_last_of(".") + 1);
if (fileExtension == "cpp" || fileExtension == "h") {
std::string destFilePath = filePath;
addBOMToFile(filePath, destFilePath);
}
}
} while (_findnext(hFile, &fileData) == 0);
_findclose(hFile);
}
}
int main() {
std::string rootDirectory;
// 根目录路径 改变路径即可根据当前路径,遍历其目录下的全部文件
std::cout << "Please Enter:";
std::cin >> rootDirectory;
// 批量转换指定根目录下的所有.cpp和.h文件
convertFilesWithBOM(rootDirectory);
std::cout << "Batch conversion completed." << std::endl;
return 0;
}
使用方法:直接将需要转化的文件的根目录输入,程序会自动完成从根目录读取全部文件,并将所有文件转化从utf8转化为utf8带BOM。