文件目录操作相关的类
Qt为文件和目录操作提供了一些类,利用这些类可以方便地实现一些操作。Qt提供的与文件和目录操作相关的类包括以下几个。
- QCoreApplication:用于提取应用程序路径、程序名等文件信息。
- QFile:除了打开文件操作外,QFile还有复制文件、删除文件等功能。
- QFilelnfo:用于提取文件的信息,包括路径、文件名、后缀等。
- QDir:用于提取目录或文件信息,获取一个目录下的文件或目录列表,创建或删除目录和文件,文件重命名等操作。
- QTemporaryDir和QTemporaryFile:用于创建临时目录和临时文件。
- QFileSystemWatcher:文件和目录监听类,监听目录下文件的添加、删除等变化,监听文件修改变化。
这些类基本涵盖了文件操作需要的主要功能,有些功能还在某些类里重复出现,例如QFile 和QDir都具有删除文件、判断文件是否存在的功能。
QCoreApplication类
QCoreApplication是为无GUI应用提供事件循环的类,是所有应用程序类的基类,其子类 QGuiApplication为有GUI界面的应用程序提供流控制和主要的设定,QGuiApplication的子类 QApplication为基于QWidget的应用程序提供支持,包括界面的初始化等。
创建的Qt Widget Application都是基于QApplication的,在main()函数里可以看到 QApplication的应用。
QCoreApplication提供了一些有用的静态函数,可以获取应用程序的名称、启动路径等信息, 几个函数的名称和功能如下 (省略了函数参数中的const关键字)。
- QString applicationDirPath():返回应用程序启动路径
- QString applicationFilePath():返回应用程序的带有目录的完整文件名
- QString applicationName():返回应用程序名称,无路径无后缀
- QStringList libraryPaths():返回动态加载库文件时,应用程序搜索的目录列表
- void setOrganizationName(QString &orgName):为应用程序设置一个机构名
- QString organizationName():返回应用程序的机构名
- void exit():退出应用程序
QFile类
前面使用QFile类进行文件的操作,应用了QFile::open()函数。除了打开文件提供读写操作 外,QFile还有一些静态函数和成员函数用于文件操作。下面是QFile的一些静态函数(省略了函数参数中的const关键字)。
- bool copy(QString &fileName, QString &newName):复制文件
- bool rename(QString &oldName, QString &newName):重命名文件
- bool remove(QString &fileName):删除文件
- bool exists(QString &fileName):判断文件是否存在
- bool setPermissions(QString &fileName, Permissions permissions):设置文件的权限,权限类型是枚举类型QFileDevice::Permission
- Permissions permissions(QString &fileName):返回文件的权限
静态函数是无需创建QFile类对象实例就可以调用的函数,例如使用静态函数exists()判断一 个文件是否存在的代码如下:
void MainWindow::on_pushButton_clicked(){// QFile: :exists ()判断文件是否存在 QString sous=ui->editFile->text () ; //源文件 bool the=QFile::exists(sous); if (the) ui->plainTextEdit->appendPlainText(+"true \n"); else ui->plainTextEdit->appendPlainText(+"false \n");}
QFile还提供了对应的成员函数,如下所示 (省略了函数参数中的const关键字)。
- void setFileName(QString &name):设置文件名,文件已打开后不能再调用此函数
- bool copy(QString &newName) :当前文件复制为newName表示的文件
- bool rename(QString &newName): 将当前文件重命名为newName
- bool remove():删除当前文件
- bool exists():判断当前文件是否存在
- bool setPermissions(Permissions permissions):设置文件权限
- Permissions permissions():返回文件的权限
- qint64 size():返回文件的大小,字节数
创建QFile对象时可以在构造函数里指定文件名,也可以用setFileName()指定文件,但是文 件打开后不能再调用setFileName()函数。指定的文件作为QFile对象的当前文件,然后成员函数copy()、rename()等都是基于当前文件的操作。
QFilelnfo类
QFilelnfo类的接口函数提供文件的各种信息。QFilelnfo对象创建时可以指定一个文件名作为当前文件,也可以用setFile()函数指定一个文件作为当前文件。
QFilelnfo常见接口函数和功能如下所示。除了一个静态函数exists()之外,其他都是公共接口函数,接口函数的操作都是针对当前文件(省略了函数参数中的const关键字)。
- void setFile(QString &name):设置一个文件名,作为QFilelnfo操作的文件
- QString absoluteFilePath():返回带有文件名的绝对文件路径
- QString absolutePath():返回绝对路径,不带文件名
- QString fileName() :返回去除路径的文件名
- QString filePath():返回包含路径的文件名
- QString path():返回不含文件名的路径
- qint64 size():返回文件大小,以字节为单位
- QString baseName():返回文件基名,第一个“.”之前的文件名
- QString completeBaseName():返回文件基名,最后一个“.”之前的文件名
- QString suffix():最后一个“.”之后的后缀
- QString completeSuffix():第一个“.”之后的后缀
- bool isDir():判断当前对象是否是一个目录或目录的快捷方式
- bool isFile():判断当前对象是否是一个文件或文件的快捷方式
- bool isExecutable():判断当前文件是否是可执行文件
- QDateTime created():返回文件创建时间
- QDateTime lastModified():返回文件最后一次被修改的时间
- QDateTime lastRead():返回文件最后一次被读取的时间
- bool exists():判断文件是否存在
- bool exists(QString &file) :静态函数,判断file表示的文件是否存在
QFilelnfo提供的这些函数可以提取文件的信息,包括目录名、文件基名(不带后缀)、文件 后缀等,利用这些函数可以实现灵活的文件操作。例如,下面的代码是利用QFile::rename()函数和QFilelnfo的一些功能实现文件重命名功能的代码,其中就用到了提取路径、提取文件基名的功能。
void MainWindow::on_pushButton_2_clicked(){ //QFile::rename() QString sous=ui->editFile->text () ; //源文件 QFileInfo fileInfo (sous) ; //源文件信息 QString newFile=fileInfo.path()+"/"+fileInfo.baseName()+".XYZ"; QFile::rename(sous, newFile);//重命名文件,更改后缀名}
QDir类
QDir是进行目录操作的类,在创建QDir对象时传递一个目录字符串作为当前目录,然后QDir 函数就可以针对当前目录或目录下的文件进行操作。下面是QDir的一些静态函数(省略了函数参数中的const关键字)。
- QString tempPath():返回临时文件目录名称
- QString rootPath():返回根目录名称
- QString homePath():返回主目录名称
- QString currentPath():返回当前目录名称
- bool setCurrent(QString &path) :设置path表示的目录为当前目录
- QFilelnfoList drives(): 返回系统的根目录列表,在Windows系统上返回的是盘符列表
在使用QFileDialog选择打开一个文件或目录时需要传递一个初始目录,这个时候就可以使用 QDir::currentPath()获取应用程序当前目录作为初始目录,前面一些实例程序的代码中已经用到过这个功能。
下面是QDir的一些公共接口函数(省略了函数参数中的const关键字)。
- QString absoluteFilePath(QString &fileName):返回当前目录下的一个文件的含绝对路径文件名
- QString absolutePath():返回当前目录的绝对路径
- QString canonicalPath():返回当前目录的标准路径
- QString filePath(QString &fileName) :返回目录下一个文件的目录名
- QString dirName():返回最后一级目录的名称
- bool exists():判断当前目录是否存在
- QStringList entryList(Filters filters = NoFilter, SortFlags sort =NoSort) :返回目录下的所有文件名、子目录名等
- bool mkdir(QString &dirName):在当前目录下建一个名称为dirName的子目录
- bool rmdir(QString &dirName) :删除指定的目录dirName
- bool remove(QString &fileName) :删除当前目录下的文件fileName
- bool rename(QString &oldName, QString &newName) :将文件或目录oldName更名为newName
- void setPath(QString &path) :设置QDir对象的当前目录
- bool removeRecursively():删除当前目录及其下面的所有文件
获取目录下的目录或文件列表的函数entryList()需要传递QDir::Filter枚举类型的参数以获取 不同的结果,QDir::Filter枚举类型的常用取值如下。
- QDir::AllDirs:列出所有目录名。
- QDir::Files:列出所有文件。
- QDir::Drives:列出所有盘符(Unix系统下无效)。
- QDir::NoDotAndDotDot:不列出特殊的符号,如“.”和“..”。
- QDir::AllEntries:列出目录下所有项目。
列出所有子目录的程序如下:
void MainWindow::on_pushButton_3_clicked(){//列出子目录 QDir dir(ui->editDir->text()); QStringList strList=dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); ui->plainTextEdit->appendPlainText("所选目录下的所有目录:"); for(int i=0;i<strList.count();i++) ui->plainTextEdit->appendPlainText(strList.at(i)); ui->plainTextEdit->appendPlainText("\n");}
列出一个目录下所有文件的程序如下:
void MainWindow::on_pushButton_4_clicked(){//列出所有文件 QDir dir(ui->editDir->text()); QStringList strList=dir.entryList(QDir::Files); ui->plainTextEdit->appendPlainText ("所选目录下的所有文件:"); for(int i=0; i<strList.count(); i++) ui->plainTextEdit->appendPlainText(strList.at(i)); ui->plainTextEdit->appendPlainText("\n");}
QTemporaryDir 和 QTemporaryFile
QTemporaryDir是用于创建、删除临时目录的类,其主要函数如下。
- void setAutoRemove(bool b):设置为是否自动删除
- QString path():返回创建的临时目录名称
- bool remove():删除此临时目录及其下面所有文件
在系统临时目录,即QDir::tempPath目录下创建一个临时目录,临时目录名称以QCoreApplication::applicationName()为前缀,后加6个字符。临时目录可以设置为使用完后自动删除,即临时目录变量删除时,临时目录也删除。
QTemporaryFile是用于创建临时文件的类,临时文件保存在系统临时目录下。临时文件以 QCoreApplication::applicationName()作为文件名,以“XXXXXX” 6个随机数字作为文件后缀。将QTemporaryFile::setAutoRemove()函数设置为是否自动删除临时文件,QTemporaryFile:: open()函数用于打开临时文件,只有打开临时文件,才实际创建了此文件。
QFileSystemWatcher类
QFileSystemWatcher是对目录和文件进行监听的类。把某些目录或文件添加到QFileSystem Watcher对象的监听列表后,当目录下发生文件新建、删除等操作时会发射directoryChanged()信号,当监听的文件发生修改、重命名等操作时,会发射fileChanged()信号。所以,这个类在进行目录或文件监听时起作用。
QFileSystemWatcher的主要接口函数如下所示 (省略了函数参数中的const关键字)。
- bool addPath(QString &path):添加一个监听的目录或文件
- QStringList addPaths(QStringList &paths) :添加需要监听的目录或文件列表
- QStringList directories():返回监听的目录列表
- QStringList files():返回监听的文件列表
- bool removePath(QString &path) :移除监听的目录或文件
- QStringList removePaths(QStringList &paths) :移除监听的目录或文件列表
QFileSystemWatcher有两个信号,分别是目录变化和文件变化时发射的信号。
- void QFileSystemWatcher::directoryChanged(const QString &path)
- void QFileSystemWatcher::fileChanged(const QString &path)
图中是实例中测试QFileSystemWatcher的界面。首先打开一个目录和一个文件,单击 “addPath开始监听”按钮将文件和目录都添加到监听列表,并且将信号与槽函数关联起来。然后在目录下复制某个文件,会发射directoryChanged()信号,重命名所监听的文件后会发射fileChanged()信号,如图所示的运行结果。
为了测试QFileSystemWatcher的功能,在主窗口类中定义了 QFileSystemWatcher类型的变量和两个信号的槽函数,定义如下:
private: QFileSystemWatcher fileWatcher;public slots: void on_directoryChanged(const QString path); void on_fileChanged(const QString path);
两个槽函数仅是显示传递的参数,并显示提示文字,其代码如下:
void MainWindow::on_directoryChanged(const QString path){//directoryChanged ()信号的槽函数 ui->plainTextEdit->appendPlainText(path); ui->plainTextEdit->appendPlainText("目录发生了变化\n");}
void MainWindow::on_fileChanged(const QString path){//fileChanged()信号的槽函数 ui->plainTextEdit->appendPlainText(path); ui->plainTextEdit->appendPlainText ("文件发生了变化\n");}
图中QFileSystemWatcher分组里“addPath开始监听”和“removePath停止监听”两个按钮的代码如下:
void MainWindow::on_pushButton_5_clicked(){//开始监听 ui->plainTextEdit->appendPlainText("监听目录:"+ui->editDir->text () +"\n"); fileWatcher.addPath(ui->editDir->text ());//添力口监听目录 fileWatcher.addPath(ui->editFile->text ());//添力口监听文件 QObject::connect(&fileWatcher,&QFileSystemWatcher::directoryChanged, this,&MainWindow::on_directoryChanged); //directoryChanged QObject::connect(&fileWatcher,&QFileSystemWatcher::fileChanged, this,&MainWindow::on_fileChanged); //fileChanged}
void MainWindow::on_pushButton_6_clicked(){//停止监听 ui->plainTextEdit->appendPlainText("停止监听:"+ui->editDir->text()+"\n"); fileWatcher.removePath(ui->editDir->text()); fileWatcher.removePath(ui->editFile->text()); QObject::disconnect(&fileWatcher,&QFileSystemWatcher::directoryChanged, this,&MainWindow::on_directoryChanged); //directoryChanged QObject::disconnect(&fileWatcher,&QFileSystemWatcher::fileChanged, this,&MainWindow::on_fileChanged); //fileChanged}
釆用addPath()函数添加目录和文件后,将信号和槽函数关联起来,开始监听。
停止监听时,用removePath()函数移除监听的目录和文件,并用disconnect()解除信号与槽的关联。