应用场景
当你下载别人的源码的时候,而别人的源码跟你自己电脑里面的编码不一致的情况下将会出现乱码,但是如果要一个个转换编码的话那么那样所需要花的时间太多,所以就有必要写一个软件递归遍历项目下面所有的文件,从而实现自动转换编码,因为项目下面又有文件夹,所有需要使用递归实现。
实现原理如下
第一步:先用这个文件原先的编码读取文件内容存到局部变量当中,然后调用QFile::remove()
方法删除文件
第二步:创建一个跟原先文件名同名的文件,然后设置你要转换的编码,(使用QTextSream::setCodec()
方法),将文件内容写入这个新创建的文件当中
以上两步就可以实现给文件转码。
代码如下
void Widget::switchCode(QString filePath)
{
QFile file(filePath);
if( !file.open(QIODevice::ReadOnly | QIODevice::Truncate))
{
return;
}
QTextStream in(&file);
in.setCodec(oldCode.toUtf8().data());
QString content = in.readAll();
//qDebug() << "content:" << content;
file.resize(0);
file.remove();
file.close();
QFile outFile(filePath);
if( !outFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
return;
}
QTextStream out(&outFile);
out.setCodec(newCode.toUtf8().data());
out << content;
outFile.close();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
上面的代码很简单,就是我跟我上面说的一样
其中需要介绍的就是oldCode和newCode,这两个代表
要转换的文件的原先编码和要转换的编码,变量是定义在类里面的
属成员变量
下面介绍如果递归实现整个项目的转化
项目递归转换
void Widget::recursion(QString filePath)
{
QDir dir(filePath);
//文件列表
QFileInfoList file_list = dir.entryInfoList(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
for(int i = 0; i < file_list.size(); i++)
{
QString path = file_list.at(i).absoluteFilePath();
//转换编码
switchCode(path);
}
//文件夹列表
QFileInfoList folder_list = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
for(int i = 0; i < folder_list.size(); i++)
{
QString path = folder_list.at(i).absoluteFilePath();
//递归遍历文件
recursion(path);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
QFileInfo
这个类表示文件信息,如果需要知道打开的文件是文件夹还是文件,就需要借助这个类,QFileInfoList
这个类是QFileInfo
类的集合,就是’QList < QFileInfo > ‘的typedef
定义,剩余的比较简单,大体的思路是先获取文件夹下面的所有文件,然后使用循环给这个文件转码,然后获取文件夹下面的所有文件夹,然后顺还进行递归调用。