CSDN话题挑战赛第2期
参赛话题:学习笔记
前言
一、监视文件和目录变化概述
在 Qt 中可以使用 QFileSystemWatcher 类监视文件和目录的改变。在使用 addPath() 函数监视指定的文件和目录时,如果需要监视多个目录,则可以使用 addPaths()函数加入监视。若要移除不需要监视的目录,则可以使用 removePath()和 removePaths()函数 。
当监视的文件被修改或删除时,产生一个 fileChanged()信号 。 如果所监视的目录被改变或删除,则产生 directoryChanged()信号。
Qt 提供了 QFile 类用于进行文件操作。 QFile 类提供了读写文件的接口,可以读写文本文件、二进制文件和 Qt 的资源文件。
处理文本文件和二进制文件,可以使用 QTextStream 类和 QDataStream 类。处理临时文件可以使用 QTemporaryFile, 获取文件信息可以使用 QFilelnfo, 处理目录可以使用 QDir, 监视文件和目录变化可以使用 QFileSystemWatcher 。
二、效果实例
图一
新建文件或者删除文件会触发“目录发生变化”
图二
三、原码实例
watcher.h
#ifndef WATCHER_H
#define WATCHER_H
#include <QWidget>
#include <QLabel>
#include <QFileSystemWatcher>
class watcher : public QWidget
{
Q_OBJECT
public:
watcher(QWidget *parent = 0);
~watcher();
public slots:
void directoryChanged(QString path);
private:
QLabel *pathLabel;
QFileSystemWatcher fsWatcher;
};
#endif // WATCHER_H
main.cpp
#include "watcher.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
watcher w;
w.show();
return a.exec();
}
watcher.cpp
#include "watcher.h"
#include <QVBoxLayout>
#include <QDir>
#include <QMessageBox>
#include <QApplication>
watcher::watcher(QWidget *parent)
: QWidget(parent)
{
QStringList args=qApp->arguments();
QString path;
if (args.count()>1) /*读取命令行指定的目录作为监视目录。如果没有指定,则监视当前目录。*/
{
path=args[1];
}else
{
path=QDir::currentPath();
}
pathLabel = new QLabel;
pathLabel->setText(tr(" 监视的目录: ")+path);
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(pathLabel);
fsWatcher.addPath(path);
/*将目录的 directoryChangedO信号与响应函数 directoryChangedO连接。*/
connect(&fsWatcher,SIGNAL(directoryChanged(QString)),this,SLOT(directoryChanged(QString)));
}
watcher::~watcher()
{
}
/*响应函数 directoryChangedO使用消息对话框提示用户目录发生了改变,*/
void watcher::directoryChanged(QString path)
{
//QMessageBox::information(NULL,tr(" 目录发生变化 "),path);
pathLabel->setText(tr(" 目录发生变化: ")+path);
}
四、总结
Qt5 文件及磁盘处理—— 监视文件和目录变化会在应用程序开发中经常用到的。