Qt 文件和文件夹操作

资源:

Qt 帮助文档
Qt 5.9 c++开发指南 第七章

复制文件

bool QFile::copy(const QString &newName)
[static] bool QFile::copy(const QString &fileName, const QString &newName)

//设置工作目录
bool ret1 = QDir::setCurrent("D:/2"); //true
//将 D:/2/1.txt 复制到 D:/2 中更名为 2.txt
bool ret2 = QFile::copy("1.txt", "2.txt"); //true
bool ret3 = QFile::copy("1.txt", "1/2.txt"); //true 存在文件夹 1,1 中无 2.txt
//如果新文件的路径不存在,则失败,不能创建路径
bool ret4 = QFile::copy("1.txt", "1/11/1.txt"); //false 不存在 11 子文件夹
//如果已有同名的文件,则失败,不能覆盖
bool ret5 = QFile::copy("1.txt", "1/3.txt"); //false 1 子文件夹中存在 3.txt

//创建文件,路径为相对路径,绝对路径为 D:/2/2.txt
QFile file1("2.txt");
//file1.setFileName("2.txt"); // 设置文件名称,路径为相对路径,和上面一样
bool ret6 = file1.copy("2/2.txt"); //true 将 D:/2/2.txt 复制到 D:/2/2 文件夹,名字仍为 2.txt

设置文件的访问权限

用户账户的介绍见 :

Windows 10 技术与应用大全 宋翔

使用函数:

[static] bool QFile::setPermissions(const QString &fileName, QFileDevice::Permissions permissions)


QFileDevice::Permissions

QFile file("D:/2/2.txt");
file.setPermissions(QFile::ReadOwner|QFile::WriteOwner|QFile::ExeOwner);

删除文件

删除单个文件

bool QFile::remove()
[static] bool QFile::remove(const QString &fileName)
bool QDir::remove(const QString &fileName)

批量删除文件

bool QDir::removeRecursively()

示例

bool ret1 = QDir::setCurrent("D:/2"); //true
QFile file1("2.txt");
//删除文件
bool ret7 = file1.remove(); //true

//1.txt 处于打开状态也删除,目录中无,但打开的文件还存在
bool ret8 = QFile::remove("1.txt"); //true 

QDir dir(QDir::current()); 
bool ret9 = dir.remove("3.txt"); //true

dir.setPath("1"); //相对路径  
QString  strPath = dir.path(); // 相对路径为 1, 绝对路径为 D:/2/1

// D:/2 的子文件夹 1 全部删除,包括里面所有的子目录和文件
bool ret10 = dir.removeRecursively();  //true

获取文件信息

QFileInfo


QFileInfo

批量修改文件名

例如一个文件夹中的文件格式为 : a_b_1.png,其中第三部分数字递增,现在需要批量修改该格式中的第二部分为 c ,示例代码如下:

QString strPath("D:/1");
QString strPathNew("D:/new");
QDir dirNew;
dirNew.mkpath(strPathNew);
QString strSplit("_");

//获取全部选中的文件
QStringList strListFiles = QFileDialog::getOpenFileNames(this, "Select Files",
                                  strPath, "Images(*.png)");

for (QString &strFile : strListFiles)
{
    QFile file(strFile);
    QFileInfo fileInfo(file);
    QString strFileName(fileInfo.fileName()); //文件名
    QStringList strList = strFileName.split(strSplit);
    if (strList.size() < 3)
       continue;

    //查找文件格式为 a_b_num.png 的文件 num 为数字
    //最后一部分内容
    QString strLastPart = strList.at(2).split(".").first();

    //如果最后一部分只能是数字
    bool ok = false;
    strLastPart.toInt(&ok); //如果是纯十进制数字,则 ok = true

    //如果最后一部分格式为包含数字,也可以含其他字符
    //ok = strLastPart.contains(QRegExp("[0-9]"));

    //替换中间的字母
    if (strList.at(0) == "a" && strList.at(1) == "b" && ok)
    {
        strFileName.replace(str.indexOf("b"), 1, "c");
    }

    QFile::copy(strFile, strPathNew + "/" + strFileName);
}

写文本文件

void MyFile::writeFile(const QStringList &strListData)
{
    QFile file("D:/LP/Test/data/samp1.txt");
    if (!file.open(QIODevice::ReadWrite | QIODevice::Text 
    							| QIODevice::Truncate))
    {
        return;
    }

    QTextStream dataStream(&file);
    dataStream << QString::fromLocal8Bit("***** 中文注释 *****")
    		   << "\n";
    dataStream << "a" << "b " << "c";

    file.close();
}

读文本文件

QFile file("D:/LP/Test/data/samp1.txt");
if (!file.open(QIODevice::ReadOnly| QIODevice::Text)
{
    return;
}

//读的文本中含中文
QTextStream textStream(&file);
textStream.setCodec("GBK");

//跳过开头的空白行和含有 ** 的注释行
while (!textStream.atEnd())
{
   int pos = textStream.pos();
   QString strLine = textStream.readLine();
   if (strLine.simplified().isEmpty() || strLine.contains(QString("**"))
       continue;

   qDebug() << "pos: " << textStream.pos();
   qDebug() << "line 1: " << strLine ;
   break;
}

//回到起始位置 读取全部行
textStream.seek(0);
QStringList strList;

while (!textStream2.atEnd())
{
    strList << textStream.readLine();
}

file.close();

压缩和解压缩文件

How can I compress (/ zip ) and uncompress (/ unzip ) files and folders with batch file without using any external tools?

压缩解压用到的脚本为 zipjs.bat
压缩文件夹使用的方法:Using Shell.Application
脚本调用语法:在命令行窗口定位到脚本所在的目录后,输入zipjs.bat,会有帮助文档说明。

该脚本文件放在 D:/2 文件夹中。

解压

解压 .zip 文件:

void readWriteFile::unzipFile()
{
    QString strTemFile("D:\\2\\tem.bat"); //调用 zipjs.bat 的脚本
    QString strBatFile("D:\\2\\zipjs.bat");
    QString strSrcFilePath("D:\\2\\1.zip");
    QString strDesPath("D:\\2\\4");
    QFile file(strTemFile);
    if (file.open(QIODevice::ReadWrite | QIODevice::Text 
    					| QIODevice::Truncate))
    {
        QTextStream stream(&file);
        stream << "@echo off" << "\n"
               << "call" << strBatFile << " unzip -source " 
               << strSrcFilePath << " -destination " << strDesPath 
               << " -keep yes -force yes" << "\n";

        file.close();

        QProcess process(NULL);
        process.setWorkingDirectory("D:/2");
        process.start(strTemFile);
        if (process.waitForFinished(1800000))
        {
            file.close();
            file.remove();
            qDebug() << "finished!";
        }

    }
}

压缩

将文件夹压缩为.zip格式且不使用外部压缩工具。

修改脚本执行命令:

QString strSrcFilePath("D:\\2\\1");
QString strDesPath("D:\\2\\4.zip");
stream << "@echo off" << "\n"
       << "call" << strBatFile << " zipDirItem -source " 
       << strSrcFilePath << " -destination " << strDesPath 
       << " -keep yes -force yes" << "\n";

XML 文件读写

Qt 读写 xml 文件

注册表文件读写

工程文件中加下面库:

LIBS += User32.lib
LIBS += Ole32.lib
#include <QMainWindow>
#include <QWidget>
#include <QFile>
#include <QDebug>
#include <msctf.h>
#include <WinUser.h>
#include <combaseapi.h>

void MainWindow::setKeyboard()
{
    //找到默认输入法的 guid
    QSettings reg("HKEY_CURRENT_USER\\Software\\Microsoft\\CTF\\Assemblies\\0x00000804\\{34745C63-B2F0-4784-8B67-5E12C8701A31}",QSettings::NativeFormat);
    bool ok;
    QString strGuidProfiles = reg.value("Profile").toString();
    LANGID langid = QString("0x00000804").toUShort(&ok, 16); //2052
    REFGUID guidProfiles = QUuid(strGuidProfiles);

    //查找 CLSID
    QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\CTF\\SortOrder\\AssemblyItem\\0x00000804\\{34745C63-B2F0-4784-8B67-5E12C8701A31}",QSettings::NativeFormat);
    QStringList strListGroup = settings.childGroups();
    QString strRclsid("");
    for (QString &strGroup : strListGroup)
    {
        settings.beginGroup(strGroup);
        if (settings.value("Profile").toString() == strGuidProfiles)
        {
            strRclsid = settings.value("CLSID").toString();
            break;
        }
        settings.endGroup();
    }
    REFCLSID rclsid = QUuid(strRclsid);

    HRESULT hr;
    ITfInputProcessorProfiles *pProfiles;

    hr = CoCreateInstance(  CLSID_TF_InputProcessorProfiles,
                            NULL,
                            CLSCTX_INPROC_SERVER,
                            IID_ITfInputProcessorProfiles,
                            (LPVOID*)&pProfiles);

    if(SUCCEEDED(hr))
    {
        if (pProfiles->SetDefaultLanguageProfile(langid, rclsid, guidProfiles) != S_OK)
            qDebug("Failed to load default language profile.");

        if (pProfiles->ActivateLanguageProfile(rclsid, langid, guidProfiles) != S_OK)
            qDebug("Failed to active language profile.");

        pProfiles->Release();
    }
    //设置默认设置
    QSettings regSettings("HKEY_CURRENT_USER\\Software\\Microsoft\\InputMethod\\Settings\\CHS",
    						QSettings::NativeFormat);
    regSettings.setValue("Default Mode", 0); //输入法默认模式(Default Mode)设置 中文(0) (英文为1)
    regSettings.setValue("Output CharSet", 0); //字符集 简体中文(0) (繁体为1)

}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值