• qt开发的小软件,可以递归转换文件编码(qt为了防止内存泄露所做的保护机制)


    应用场景

    当你下载别人的源码的时候,而别人的源码跟你自己电脑里面的编码不一致的情况下将会出现乱码,但是如果要一个个转换编码的话那么那样所需要花的时间太多,所以就有必要写一个软件递归遍历项目下面所有的文件,从而实现自动转换编码,因为项目下面又有文件夹,所有需要使用递归实现。


    实现原理如下

    第一步:先用这个文件原先的编码读取文件内容存到局部变量当中,然后调用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定义,剩余的比较简单,大体的思路是先获取文件夹下面的所有文件,然后使用循环给这个文件转码,然后获取文件夹下面的所有文件夹,然后顺还进行递归调用。

    软件界面展示

    转码图片展示

    最后附上源码:点我下载 
    打包好了的软件:点我下载

    版权声明:本文为博主原创文章,转载请保留原文链接 https://blog.csdn.net/SuperVictim/article/details/52725081
  • 相关阅读:
    cordova build android get Execution failed for task ':dexArmv7Debug'
    brew install memcache get Error: Formulae found in multiple taps
    快速激活JetBrains系列产品
    NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
    `libsass` bindings not found. Try reinstalling `node-sass`?
    Cordova 快速入门记录
    perl: warning: Setting locale failed.
    httpclient源码分析之 PoolingHttpClientConnectionManager 获取连接
    httpclient源码分析之MainClientExec
    fastjson从1.1.41升级到1.2.28的坑
  • 原文地址:https://www.cnblogs.com/findumars/p/6030957.html
Copyright © 2020-2023  润新知