Qt: 文件目录操作(QCoreApplication、QFile、QFileInfo、QDir、QTemporaryDir/File、QFileSystemWatcher)

QT提供的与文件和目录相关的类包括以下几个:


QCoreApplication:用于提取应用程序路径、程序名等文件信息

QFile:除了打开文件操作外,还可以复制文件、删除文件等功能

QFileInfo:用于提取文件信息,包括路径、文件名、后缀等

QDir:用于提取目录或文件信息,获取一个目录下的文件或目录列表,创建或删除目录和文件,文件重命名等操作

QTemporaryDir、QTemporaryFile:用于创建临时目录和临时文件

QFileSystemWatc:文件和目录监听类、监听目录下文件的添加、删除等变化,监听文件修改变化

一、QCoreApplication

QCoreApplication是为无GUI引用程序提供时间循环的类,是所有应用程序类的基类,其子类QGuiApplication为有GUI界面的应用程序提供流控制和主要的设定,QGuiApplication的子类QApplication为基于QWidget的应用程序提供支持,包括界面的初始化等

创建的 Qt Widget Application都是基于QApplication的,在main()函数里可以看到QApplication的应用

QCoreApplication的静态函数

  • 下面的静态函数可以获取应用程序的名称、启动路径等信息(省略了函数参数中的const关键字)

image.png

演示案例:

  • 通过QCoreApplication的子类QApplication调用这些函数,来获取我们想要的信息

image.png

image.png

二、QFile

  • 功能:前面的文件介绍过了QFile对文件的读写功能,QFile还提供了一些静态函数和成员函数用于文件操作

image.png

QFile的成员函数

  • setFileName():如果QFile在初始化时没有指定文件,可以使用该函数指定文件,但是只能调用一次,后面就不可以再调用了

image.png

附加函数:

  • errorString();  //获取错误信息

Permissions文件访问权限

  • 文件访问权限是整型,一般用16进制显示。是一组权限的组合

image.png

演示案例

  • QFile按钮的clicked函数


image.png

void Widget::on_btn_QFile_clicked()
{
    QString fileName=QFileDialog::getOpenFileName(this,QStringLiteral("请选择一个文件"),\
                                      QDir::currentPath(),QStringLiteral(".h文件(*.h);;所有文件(*.*)"));
    if(fileName.isEmpty())
        return;
    QFile aFile(fileName);
    if(!aFile.open(QIODevice::ReadOnly|QIODevice::Text))
        return;
    
    ui->plainTextEdit->appendPlainText(QStringLiteral("文件大小:")+QString::number(aFile.size())+"\n");
    ui->plainTextEdit->appendPlainText(QStringLiteral("文件访问权限:")+QString::number(aFile.permissions(),16)+"\n");
    
    aFile.close();

三、QFileInfo

功能:QFileInfo类的接口可以获取文件的各种信息(包括目录名、文件基名(不带后缀)、文件后缀等),利用这些函数可以实现灵活的文件操作

可以用QFileInfo的构造函数指定一个文件名作为当前文件,也可以使用setFile()函数指定一个文件作为当前的文件

常用函数:

  • 除了最后一个静态函数exists()之外,其他都是公共接口函数

image.png

演示案例:

  • 打开并打印文件信息(路径和大小)

QFile file("image.jpg");
QFileInfo info(file);//获取文件的信息
 
qDebug() << QStringLiteral("路径") << info.absoluteFilePath()
         << QStringLiteral("大小") << info.size();
file.close();

打开一个文件,并且更改名称(在磁盘上也更改了)

image.png

void Widget::on_btn_QFileInfo_clicked()
{
    QString oldFileName=QFileDialog::getOpenFileName(this,QStringLiteral("请选择一个文件"),\
                                      QDir::currentPath(),QStringLiteral(".h文件(*.h);;所有文件(*.*)"));
    if(oldFileName.isEmpty())
        return;
 
    QFileInfo fileInfo(oldFileName);
    QString newFileName=fileInfo.path()+"/"+fileInfo.baseName()+".XYZ"; //设置新文件名称
    QFile::rename(oldFileName,newFileName); //改名
 
    ui->plainTextEdit->appendPlainText(QStringLiteral("源文件名为:")+oldFileName+"\n");
    ui->plainTextEdit->appendPlainText(QStringLiteral("重命名为:")+newFileName);
}

四、QDir

  • 功能:QDir是进行目录操作的类,在创建QDir对象时传递一个目录字符串作为当前目录,然后QDir函数就可以针对这个目录或目录下的文件进行操作

  • QDir对象不给出路径时,默认的是当前程序.exe的目录

QDir静态函数(省略了函数参数中的const关键字)

image.png

附加函数:

  • absolutePath();//返回QDir给出的路径,返回值为QString

  • current();     //返回当前路径以及各种信息

QDir的成员函数(省略了函数参数中的const关键字)

image.png

entryList()函数的参数:


需要传递QDir::Filter枚举类型的参数以获取不同的结果(枚举类型的常用取值如下)或者使用过滤器返回特定类型的文件、子目录名


QDir::AllDirs ==>列出所有目录名

QDir::Files ==>列出所有文件

QDir::Drives ==>列出所有盘符(Unix系统下无效)

QDir::NoDotAndDotDot ==>不列出特殊的符号,如".",".."

QDir::AllEntries ==>列出目录下所有项目

//过滤器的使用
Dir mDir(QDir::current());
QStringList filters;
filters<<"*.cpp"<<"*.h"<<"*.txt"<<".pro";  //设置指定的文件类型
mDir.setNameFilters(filters);  //设置过滤器
qDebug()<<mDir.entryList(filters, QDir::Files); //打印帅选出的条目
exists();   //如果路径中含有标点符号可能会不识别

附加函数:

count();  //返回路径下的文件数量(文件夹+文件),隐藏文件也会加进去

cd();     //进入指定路径,不同盘下需要切换盘

cdUp();   //返回上一级

entryList(); //返回目录中所有文件和目录的名称列表

entryInfoList(); //返回目录中QFileInfo对象列表(包含对象为entryList)

entryInfoList().size();//返回目录下文件、文件夹数量

目录属性函数

  • isReadable();

  • isAbsolute();

  • isRelative();

  • isRoot();

演示案例

  • 例:打印路径下的所有文件与文件夹

QDir dir("E:\QT");
foreach (QFileInfo mItem, dir.entryInfoList())//遍历路径下的每一项
{
    if(mItem.isDir())//如果是文件夹
    {
        qDebug() << " Dir " << mItem.filePath();  //打印路径
    }
    else//如果不是文件夹
    {
        qDebug() << "File" << mItem.filePath();
    }
}

打印当前的目录信息

image.png

void Widget::on_btn_QDir_clicked()
{
    ui->plainTextEdit->appendPlainText(QStringLiteral("临时文件目录名称:")+QDir::tempPath()+"\n");
    ui->plainTextEdit->appendPlainText(QStringLiteral("根目录名称:")+QDir::rootPath()+"\n");
    ui->plainTextEdit->appendPlainText(QStringLiteral("主目录名称:")+QDir::homePath()+"\n");
    ui->plainTextEdit->appendPlainText(QStringLiteral("当前目录名称:")+QDir::currentPath()+"\n");
}

五、QTemporaryDir、QTemporaryFile

QTemporaryDir:

  • 功能:用于创建、删除临时目录

主要函数如下:

image.png

特点:

  • 在系统临时目录,即QDir::tempPath目录下创建一个临时目录,临时目录名称一QCoreApplication::applicationName()为前缀,后加6个字符。

  • 临时目录可以设置为使用完后自动删除,即临时目录变量删除时,临时目录也删除

QTemporaryFile:

功能:用于创建临时文件

特点:


  • 创建的临时文件保存在系统临时目录下

  • 临时文件以QCoreApplication::applicationName()作为文件名,以“XXXXXX”6个随机数字作为文件前缀

  • QTemporaryFile::setAutoRemove()函数设置为是否自动删除临时文件

  • QTemporaryFile::open()函数用于打开临时文件,只有打开临时文件,才实际创建了此文件

六、QFileSystemWatcher

  • 功能:QFileSystemWatcher是对目录和文件进行监听的类

directoryChanged()、fileChanged()信号

把某些目录或文件添加到QFileSystemWatcher对象的监听列表后


  • 当监听的目录发生文件新建、删除等操作时会发射directoryChanged信号

  • 当监听的文件发生修改、重命名等操作时,会发生fileChanged信号

image.png

常用函数如下(省略了函数参数中的const关键字)

image.png

演示案例:

image.png

点击监听按钮,使用addPath函数对一个文件和一个目录开启监听,使用connect()将信号与槽相关联

点击取消监听,使用removePath()对刚才的文件和目录取消监听,并使用disconnect()解除信号与槽的关联

第一步:在类中定义一个QFileSystemWatcher对象,和两个自定义槽函数

image.png

第二步:点击两个按钮,分别选择一个文件和目录

image.png

void Widget::on_btn_selectFile_clicked()
{
    QString fileName=QFileDialog::getOpenFileName(this,QStringLiteral("请选择一个文件"),QDir::currentPath());
    if(fileName.isEmpty())
        return;
    ui->lineEdit_file->setText(fileName);
}
 
void Widget::on_btn_selectDir_clicked()
{
    QString dirName=QFileDialog::getExistingDirectory(this,QStringLiteral("选择一个目录"),QDir::currentPath());
    if(dirName.isEmpty())
        return;
    ui->lineEdit_dir->setText(dirName);
}

第三步:点击监听按钮,对上面选择的文件和目录开启监听,并且绑定信号与槽的关系

image.png

void Widget::on_btn_startWather_clicked()
{
    //添加监听对象
    fileWathcer.addPath(ui->lineEdit_file->text());
    fileWathcer.addPath(ui->lineEdit_dir->text());
 
    //绑定信号与槽
    QObject::connect(&fileWathcer,&QFileSystemWatcher::directoryChanged,this,&Widget::on_directoryChanged);
    QObject::connect(&fileWathcer,&QFileSystemWatcher::fileChanged,this,&Widget::on_fileChanged);
}

第四步:点击停止监听按钮,对上面选择的文件和目录取消监听,并且解除信号与槽的关系

image.png

void Widget::on_btn_stopWather_clicked()
{
    //解除监听对象
    fileWathcer.removePath(ui->lineEdit_file->text());
    fileWathcer.removePath(ui->lineEdit_dir->text());
 
    //解除信号与槽
    QObject::connect(&fileWathcer,&QFileSystemWatcher::directoryChanged,this,&Widget::on_directoryChanged);
    QObject::connect(&fileWathcer,&QFileSystemWatcher::fileChanged,this,&Widget::on_fileChanged);
}

第五步:定义两个槽函数,当接收到信号时触发

void Widget::on_fileChanged(const QString path)
{
    ui->plainTextEdit->appendPlainText(path);
    ui->plainTextEdit->appendPlainText(QStringLiteral("文件发生了变化"));
}
 
void Widget::on_directoryChanged(const QString path)
{
    ui->plainTextEdit->appendPlainText(path);
    ui->plainTextEdit->appendPlainText(QStringLiteral("目录发生了变化"));
}

演示效果

  • 选择一个文件和目录,改变文件的内容/在目录下新建一个文件,都会触发槽函数

image.png

image.png





————————————————

版权声明:本文为CSDN博主「江南、董少」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_41453285/article/details/100019987


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864