Qt模块化笔记之core——Input/Output文件操作(2)

上节介绍了QIoDevice及QFile等的使用,相信大家对这些输入输出类有一些认识了,本节将主要介绍下一些算是作为辅助用的类,它们是:

QDir QFileInfo QFileSystemWatcher  QTemporaryDir QTemporaryFile

以下分别介绍:

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

QDir 是文件系统的目录类,用于目录相关操作,提供文件名及路径信息

Public Functions

  QDir(const QDir & dir)
  QDir(const QString & path = QString())
  QDir(const QString & path, const QString & nameFilter, SortFlags sort = SortFlags( Name | IgnoreCase ), Filters filters = AllEntries)
  ~QDir()
QString absoluteFilePath(const QString & fileName) const 返回文件绝对路径
QString absolutePath() const
QString canonicalPath() const返回规范路径;具体可见点此进入
bool cd(const QString & dirName)改变QDir中原本的路径,使它代表一个新的目录名 cd应是change dir的缩写
bool cdUp()返回到上一级目录, cd("..") 等价于cdUp().
uint count() const 返回一个目录中所有子目录及文件数量和
QString dirName() const 
QFileInfoList entryInfoList(const QStringList & nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort) const返回目录内所有文件信息,第一个参数即加入一条字符串列表的过滤器,详细见例子
QFileInfoList entryInfoList(Filters filters = NoFilter, SortFlags sort = NoSort) const
QStringList entryList(const QStringList & nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort) const返回过滤后所有文件名及目录名
QStringList entryList(Filters filters = NoFilter, SortFlags sort = NoSort) const
bool exists(const QString & name) const
bool exists() const
QString filePath(const QString & fileName) const
Filters filter() const 
bool isAbsolute() const 判断是否是绝对路径
bool isReadable() const 判断是否可读
bool isRelative() const是否相对路径
bool isRoot() const 是否是根目录,Unix的root如"/". Windows盘符如"c:/".
bool makeAbsolute()将给的相对路径转成绝对
bool mkdir(const QString & dirName) const创建一个子目录
bool mkpath(const QString & dirPath) const创建多重目录,如创建"/home/dir1/dir2/dir3",这样,dir1,dir2,dir3都将被创建
QStringList nameFilters() const
QString path() const
void refresh() const刷新目录信息
QString relativeFilePath(const QString & fileName) const
bool remove(const QString & fileName)移除某文件
bool removeRecursively()移除整个目录,即使它不为空目录,Recursively表递归的
bool rename(const QString & oldName, const QString & newName)
bool rmdir(const QString & dirName) const 只能移除空目录,移除空目录成功返回true
bool rmpath(const QString & dirPath) const 移除所有相关父目录,与mkdir相反
void setFilter(Filters filters)创建过滤器
void setNameFilters(const QStringList & nameFilters)
void setPath(const QString & path)
void setSorting(SortFlags sort)排列方式,如按文件名或时间或大小等
SortFlags sorting() const
void swap(QDir & other)将当前的QDir实例替换成另一个
bool operator!=(const QDir & dir) const
QDir & operator=(const QDir & dir)
QDir & operator=(QDir && other)
bool operator==(const QDir & dir) const
QString operator[](int pos) const

 主要难的是entryInfoList函数,举例如下:

 QDir dir("一个新目录");
    QStringList filters;
    if(dir.exists())
    {
        qDebug()<<dir.count();
        filters << "*.txt"<< "*.cpp";
        QList<QFileInfo> fl=dir.entryInfoList(filters,QDir::Files,QDir::Time);
        foreach (QFileInfo a, fl) {
            qDebug()<< a.baseName();
        }
    }else
    {
        qDebug()<<"不存在目录";
    }
过滤是一个QStrinList类型 的,我们在filters过滤器中加入了txt和cpp后辍

函数原型如下:

entryInfoList(const QStringList & nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort) const
将过滤器加入第一个参数,它是名称过滤,只有以txt和cpp后辍满足,是自定义的;

第二个过滤器是系统的,为枚举类型,有一些可选 的诸如,可以不包括进快捷方式,只读或只写等,上述代码中列举所有文件

第三个为排序,枚举类型,可按时间,文件大小等排序;

最后用是foreach遍历并在控制台输出了满足条件的文件名;

如下:其中一个doc后辍的被过滤掉了(如需要测试源码,需要将相关文件夹复制到构建目录中)


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

QFileInfo 可得出文件相当的信息,如文件大小,修改时间等

Public Functions

  QFileInfo()
  QFileInfo(const QString & file)
  QFileInfo(const QFile & file)
  QFileInfo(const QDir & dir, const QString & file)
  QFileInfo(const QFileInfo & fileinfo)
  ~QFileInfo()
QDir absoluteDir() const
QString absoluteFilePath() const
QString absolutePath() const
QString baseName() const最基本名称,文件名不带后辍(suffix)
QString bundleName() const
bool caching() const 是否支持缓存?
QString canonicalFilePath() const返回抽象路径名的规范路径名字符串
QString canonicalPath() const
QString completeBaseName() const 文件名,除后辍. 以后,如*.tar.gz压缩格式,返回“*.tar
QString completeSuffix() const 文件完整的后辍,如*.tar.gz压缩格式,返回“tar.gz
QDateTime created() const返回创建时间
QDir dir() const 返回一个QDir对象,比较复杂,见例子的输出
bool exists() const
QString fileName() const 完整文件名,带后辍
QString filePath() const
QString group() const 文件所属“组”,windows中不存在这个
uint groupId() const
bool isAbsolute() const
bool isBundle() const
bool isDir() const
bool isExecutable() const 是否是可执行程序
bool isFile() const
bool isHidden() const
bool isNativePath() const
bool isReadable() const
bool isRelative() const
bool isRoot() const
bool isSymLink() const
bool isWritable() const
QDateTime lastModified() const 最后修改时间
QDateTime lastRead() const 最后读取时间
bool makeAbsolute()
QString owner() const
uint ownerId() const
QString path() const
bool permission(QFile::Permissions permissions) const
QFile::Permissions permissions() const
void refresh()
void setCaching(bool enable)
void setFile(const QString & file)
void setFile(const QFile & file)
void setFile(const QDir & dir, const QString & file)
qint64 size() const 返回文件大小
QString suffix() const
void swap(QFileInfo & other)
QString symLinkTarget() const
bool operator!=(const QFileInfo & fileinfo) const
QFileInfo & operator=(const QFileInfo & fileinfo)
QFileInfo & operator=(QFileInfo && other)
bool operator==(const QFileInfo & fileinfo) const

QFileInfo info1("一个新目录/test.txt");
    if(info1.exists())
    {
        qDebug()<<info1.baseName();
        qDebug()<<info1.completeBaseName();
        qDebug()<<info1.created().toString();
        qDebug()<<info1.lastModified().toString();
        qDebug()<<info1.lastRead().toString();
        qDebug()<<info1.dir();
        qDebug()<<info1.size();
        qDebug()<<info1.absoluteFilePath();
    }

输出如下:

"test"

"test"

"周六 十二月 28 23:24:32 2013"

"周五 十二月 27 10:53:49 2013"

"周六 十二月 28 23:24:32 2013"

QDir( "一个新目录" , nameFilters = { * }, QDir::SortFlags( Name | IgnoreCase ) , QDir::Filters( Dirs|Files|Drives|AllEntries ) )

60

"D:/Qt/myProjects/build-qt-Modules-core-Input_Output-QDir_and_others-Desktop_Qt_5_2_0_MinGW_32bit-Debug/一个新目录/test.txt" 

——————

dir()函数返回的是一个对象,比较复杂,其它比较容易理解

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

QFileSystemWatcher直译为文件系统观察者,用于监视目录及文件的变化,它既可以用addPath()或addPaths()添加一个或多个目录路径,也可以用它们添加文件路径。反之,可用removePath()或removePaths()移除路径。它有两个主要信号:

void directoryChanged(const QString & path)//目录变化
void fileChanged(const QString & path)//文件变化
当所添加的文件路径的文件被修改、重命名或移除时,fileChanged()发送

当所添加的目录内的内容(文件夹与文件)被修改或移除时,directoryChanged发送

测试代码如下:

#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>
#include <QStringList>

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    watcher=new QFileSystemWatcher;
    if(watcher->addPath("目录")&& watcher->addPath("目录/test1.txt"))//添加一个目录及文件路径
    {
        qDebug()<< watcher->directories();//返回监视的目录名即"目录"
        qDebug()<< watcher->files();//返回所监视的文件名

    }
    connect(watcher,SIGNAL(directoryChanged(QString)),this,SLOT(m_directoryChanged(QString)));
    connect(watcher,SIGNAL(fileChanged(QString)),this,SLOT(m_fileChanged(QString)));
}
void Dialog::m_directoryChanged(QString path)
{
    qDebug()<<"目录路径:"<<path<<"变化";
}

void Dialog::m_fileChanged(QString path)
{
     qDebug()<<"文件路径:"<<path<<"变化";
}

Dialog::~Dialog()
{
    delete ui;
}

最终得到如下测试结果:

("目录")

("目录/test1.txt")

文件路径: "目录/test1.txt" 变化

目录路径: "目录" 变化

目录路径: "目录" 变化 


第一行与第二行是添加进的目录路径与文件路径,从连接的信号与槽可看出,信号的参数path指的是所监控的目录路径与文件路径,可用它识别是哪个发生变化

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


QTemporaryDir与QTemporaryFile分别用于创建临时目录与文件

QTemporaryDir有如下方法:

Public Functions

  QTemporaryDir()
  QTemporaryDir(const QString & templateName)
  ~QTemporaryDir()
bool autoRemove() const//判断是否自动删除目录
bool isValid() const//判断是否创建目录成功
QString path() const返回临时目录的路径
bool remove()移除目录
void setAutoRemove(bool b)设置是否自动移除,默认为true
使用时:

QTemporaryDir dir;
    if (dir.isValid()) {
        // dir.path() 返回唯一的目录路径
    }

QTemporaryFile类似
—————————————————————————————————————————————————————————————

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值