上节介绍了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)//文件变化 |
当所添加的目录内的内容(文件夹与文件)被修改或移除时,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类似
—————————————————————————————————————————————————————————————