QT 文件监视系统QFileSystemWatcher监视目录的改变
- 相关操作说明
- mainwindow.h
- mainwindow.cpp
- 调试结果
相关操作说明
添加头文件
Header:
#include
qmake:
QT += core
bool QFileSystemWatcher::addPath(const QString &path)
如果路径存在,则会向文件系统监视器添加路径。如果该路径不存在,或者该路径已被文件系统监视器监视,则不会添加该路径。
如果路径指定了一个目录,则当修改或从磁盘中删除路径时,将发出目录更改的directoryChanged()信号;
否则,当修改、重命名或删除路径时,将发出文件化的fileChanged()信号。
[static] QString QDir::currentPath()
返回应用程序的当前目录的绝对路径。
bool QDir::mkdir(const QString &dirName) const
创建一个名为目录名的子目录。
成功时返回true;否则将返回false。如果在调用此函数时该目录已经存在,则它将返回false。
QString QDir::path() const
returns the path. this may contain symbolic links, but never contains redundant “.”, “…” or multiple separators.
返回该路径。这可能包含符号链接,但从不包含冗余 "."
;, ".."
或多个分隔符。
[signal] void QFileSystemWatcher::directoryChanged(const QString &path)
当修改指定路径上的目录(例如,添加或删除文件)或从磁盘中删除时,就会发出此信号。请注意,如果在短时间内发生了多个更改,则某些更改可能不会发出此信号。然而,变化序列中的最后一个变化总是会产生这个信号。
注意
:这是一个私人信号。它可以用于信号连接,但不能由用户发出。
[signal] void QFileSystemWatcher::fileChanged(const QString &path)
当将指定路径上的文件从磁盘中进行修改、重命名或删除时,就会发出此信号。
注意:作为一种安全措施,许多应用程序通过编写一个新文件,然后删除一个旧文件来保存一个打开的文件。在插槽函数中,您可以检查watcher.files().contains(路径)。如果它返回false,请检查该文件是否仍然存在,然后调用添加路径()以继续监视它。
注意
:这是一个私人信号。它可以用于信号连接,但不能由用户发出。
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QFileDialog>
#include <QFile>
#include <QFileSystemWatcher>
#include <QMessageBox>
#include <QVBoxLayout>
#include <QLabel>
#include <QDebug>
#include <QApplication>
#include <QDateTime>
#include <QDir>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void DirChanged( QString path);
void FileChanged(QString filename);
private:
QFileSystemWatcher filewatcher;//文件系统监视对象
QLabel *label;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QStringList list = qApp->arguments();//获取行参数
qDebug()<<"\nlist = "<<list.size();
for (int i=0;i<list.size();i++) {
qDebug()<<"i="<<i<<"list = "<<list.at(i);
}
QString strpath;
if(list.count() > 1)
strpath = list.at(1);
else
strpath = QDir::currentPath();//当前工程路径
qDebug()<<"\nstrpath = "<<strpath;
label = new QLabel(this);
label->setFixedSize(100,100);
label->setWordWrap(true);
label->setText(tr("监视目录为:\n")+strpath);
this->setFixedSize(QSize(500,500));
filewatcher.addPath(strpath); //添加系统监控路径
QDir dir;
dir.cd(QDir::currentPath()); //进入当前目录
dir.mkdir("ddd"); //创建文件夹
//dir.cdUp(); //进入上一级目录
qDebug()<<"path = "<<dir.path();
QFile file;
file.setFileName(QDir::currentPath()+"/ddd/"+"w.txt");//在ddd/创建文本文件
bool isopen = file.open(QIODevice::WriteOnly | QIODevice::Text);
if(!isopen)
{
qDebug()<<"文件打开失败";
return;
}
filewatcher.addPath(file.fileName());
connect(&filewatcher,SIGNAL(directoryChanged( QString)),this,SLOT(DirChanged( QString)));
connect(&filewatcher,SIGNAL(fileChanged( QString)),this,SLOT(FileChanged( QString)));
}
MainWindow::~MainWindow()
{
}
//创建目录 或者 创建目录等会监控到弹出警告框
void MainWindow::DirChanged(QString path)
{
qDebug()<<"path = "<<path;//当前目录路径
QMessageBox::warning(NULL,"系统监控目录变化",path);
}
//当修改、重命名或删除文件时
void MainWindow::FileChanged(QString filename)
{
qDebug()<<"filename = "<<filename;//当前目录路径
QMessageBox::critical(NULL,"系统监控目录文本文件变化",filename);
}
调试结果
修改目录 删除 重命名等
修改文件 删除 重命名等