Qt:42---文件目录操作(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关键字)

演示案例:

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

二、QFile

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

QFile的静态函数

QFile的成员函数

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

附加函数:

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

Permissions文件访问权限

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

演示案例

  • QFile按钮的clicked函数

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()之外,其他都是公共接口函数

演示案例:

  • 打开并打印文件信息(路径和大小)
QFile file("image.jpg");
QFileInfo info(file);//获取文件的信息

qDebug() << QStringLiteral("路径") << info.absoluteFilePath()
         << QStringLiteral("大小") << info.size();
file.close();
  • 打开一个文件,并且更改名称(在磁盘上也更改了)

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关键字)

附加函数:

  • absolutePath();//返回QDir给出的路径,返回值为QString
  • current();     //返回当前路径以及各种信息

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

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();
    }
}
  • 打印当前的目录信息

 

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:

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

主要函数如下:

特点:

  • 在系统临时目录,即QDir::tempPath目录下创建一个临时目录,临时目录名称一QCoreApplication::applicationName()为前缀,后加6个字符。
  • 临时目录可以设置为使用完后自动删除,即临时目录变量删除时,临时目录也删除

QTemporaryFile:

  • 功能:用于创建临时文件

特点:

  • 创建的临时文件保存在系统临时目录下
  • 临时文件以QCoreApplication::applicationName()作为文件名,以“XXXXXX”6个随机数字作为文件前缀
  • QTemporaryFile::setAutoRemove()函数设置为是否自动删除临时文件
  • QTemporaryFile::open()函数用于打开临时文件,只有打开临时文件,才实际创建了此文件

六、QFileSystemWatcher

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

directoryChanged()、fileChanged()信号

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

  • 当监听的目录发生文件新建、删除等操作时会发射directoryChanged信号
  • 当监听的文件发生修改、重命名等操作时,会发生fileChanged信号

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

演示案例:

  • 点击监听按钮,使用addPath函数对一个文件和一个目录开启监听,使用connect()将信号与槽相关联
  • 点击取消监听,使用removePath()对刚才的文件和目录取消监听,并使用disconnect()解除信号与槽的关联

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

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

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);
}

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

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);
}

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

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("目录发生了变化"));
}

演示效果

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

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董哥的黑板报

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值