應用場景
當你下載別人的源碼的時候,而別人的源碼跟你自己電腦裏面的編碼不一致的情況下將會出現亂碼,但是如果要一個個轉換編碼的話那麼那樣所需要花的時間太多,所以就有必要寫一個軟件遞歸遍歷項目下面所有的文件,從而實現自動轉換編碼,因爲項目下面又有文件夾,所有需要使用遞歸實現。
實現原理如下
第一步:先用這個文件原先的編碼讀取文件內容存到局部變量當中,然後調用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();
}
上面的代碼很簡單,就是我跟我上面說的一樣
其中需要介紹的就是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);
}
}
QFileInfo
這個類表示文件信息,如果需要知道打開的文件是文件夾還是文件,就需要藉助這個類,QFileInfoList
這個類是QFileInfo
類的集合,就是’QList < QFileInfo > ‘的typedef
定義,剩餘的比較簡單,大體的思路是先獲取文件夾下面的所有文件,然後使用循環給這個文件轉碼,然後獲取文件夾下面的所有文件夾,然後順還進行遞歸調用。