Since I had a request,
Here is my fileWatcher implementation.
It uses Pimpl and some custom functions, it won't work out of the box.
qkFileWatcher.h :
#ifndef QKFILEWATCHER_H
#define QKFILEWATCHER_H
#include <qkGlobalHeader.h>
// Qt includes
#include <qobject>
#include <qdateTime>
class qkFileWatcherPrivate;
class qkFileWatcher;
class QKCORE_EXPORT qkFileWatch
{
public: // Enums
enum FileType
{
invalidType = 0,
fileType,
folderType
};
public: // Ctor
qkFileWatch(qkFileWatcher * watcher);
qkFileWatch
(const QString & path, qkFileWatcher
* watcher
);
qkFileWatch
(FileType type,
const QString & path, qkFileWatcher
* watcher
);
virtual ~qkFileWatch() {}
public: // Interface
virtual void checkChange();
void refreshDate();
protected: // Functions
void request_fileModified
(const QString parentPath,
const QString fileName
);
void request_folderModified
(const QString parentPath,
const QString folderName
);
protected: // Variables
FileType mType;
qint64 mSize;
qkFileWatcher * mWatcher;
public: // Properties
bool isValid() const;
bool isFile() const;
bool isDirectory() const;
bool exists() const;
FileType type() const;
};
class QKCORE_EXPORT qkFolderWatch : public qkFileWatch
{
public: // Ctor
qkFolderWatch
(const QString & path, qkFileWatcher
* watcher
);
public: // qkFileWatch interface reimplementation
bool contains
(const QString & path
);
virtual void checkChange();
private: // Functions
void recurseDirectories();
void checkDeleted();
int getFolderIndex_from_path
(const QString & path
);
int getFileIndex_from_path
(const QString & path
);
private: // Variables
QList<qkFileWatch> mFileWatchs;
QList<qkFolderWatch> mFolderWatchs;
};
class QKCORE_EXPORT qkFileWatcher
: public QObject,
public qkPrivatable
{
Q_OBJECT
friend class qkFileWatch;
friend class qkFolderWatch;
private:
QK_DECLARE_PRIVATE(qkFileWatcher);
public:
qkFileWatcher
(QObject * parent
= 0);
virtual ~qkFileWatcher();
public: // Interface
void addPath
(const QString & path
);
void removePath
(const QString & path
);
bool contains
(const QString & path
);
private slots:
void onCheckForChange();
private: // Functions
void request_folderModified
(const QString parentPath,
const QString folderName
);
void request_fileModified
(const QString parentPath,
const QString fileName
);
signals:
// Folder
void folderModified
(const QString parentPath,
const QString folderName
);
// File
};
#endif // QKFILEWATCHER_H
#ifndef QKFILEWATCHER_H
#define QKFILEWATCHER_H
#include <qkGlobalHeader.h>
// Qt includes
#include <qobject>
#include <qdateTime>
class qkFileWatcherPrivate;
class qkFileWatcher;
class QKCORE_EXPORT qkFileWatch
{
public: // Enums
enum FileType
{
invalidType = 0,
fileType,
folderType
};
public: // Ctor
qkFileWatch(qkFileWatcher * watcher);
qkFileWatch(const QString & path, qkFileWatcher * watcher);
qkFileWatch(FileType type, const QString & path, qkFileWatcher * watcher);
virtual ~qkFileWatch() {}
public: // Interface
virtual void checkChange();
void refreshDate();
protected: // Functions
void request_fileModified(const QString parentPath, const QString fileName);
void request_filesCreated(const QString parentPath, const QStringList fileNames);
void request_filesDeleted(const QString parentPath, const QStringList fileNames);
void request_folderModified(const QString parentPath, const QString folderName);
void request_foldersCreated(const QString parentPath, const QStringList folderNames);
void request_foldersDeleted(const QString parentPath, const QStringList folderNames);
protected: // Variables
QString mPath;
QString mAbsolutePath;
QString mName;
FileType mType;
QDateTime mLastModified;
qint64 mSize;
qkFileWatcher * mWatcher;
public: // Properties
QString path() const;
QString absolutePath() const;
QString name() const;
bool isValid() const;
bool isFile() const;
bool isDirectory() const;
bool exists() const;
FileType type() const;
};
class QKCORE_EXPORT qkFolderWatch : public qkFileWatch
{
public: // Ctor
qkFolderWatch(const QString & path, qkFileWatcher * watcher);
public: // qkFileWatch interface reimplementation
bool contains(const QString & path);
virtual void checkChange();
private: // Functions
void recurseDirectories();
void checkDeleted();
int getFolderIndex_from_path(const QString & path);
int getFileIndex_from_path(const QString & path);
private: // Variables
QList<qkFileWatch> mFileWatchs;
QList<qkFolderWatch> mFolderWatchs;
};
class QKCORE_EXPORT qkFileWatcher : public QObject, public qkPrivatable
{
Q_OBJECT
friend class qkFileWatch;
friend class qkFolderWatch;
private:
QK_DECLARE_PRIVATE(qkFileWatcher);
public:
qkFileWatcher(QObject * parent = 0);
virtual ~qkFileWatcher();
public: // Interface
void addPath(const QString & path);
void removePath(const QString & path);
bool contains(const QString & path);
private slots:
void onCheckForChange();
private: // Functions
void request_folderModified(const QString parentPath, const QString folderName);
void request_foldersCreated(const QString parentPath, const QStringList folderNames);
void request_foldersDeleted(const QString parentPath, const QStringList folderNames);
void request_fileModified(const QString parentPath, const QString fileName);
void request_filesCreated(const QString parentPath, const QStringList fileNames);
void request_filesDeleted(const QString parentPath, const QStringList fileNames);
signals:
// Folder
void folderModified(const QString parentPath, const QString folderName);
void foldersCreated(const QString parentPath, const QStringList folderNames);
void foldersDeleted(const QString parentPath, const QStringList folderNames);
// File
void fileModified(const QString parentPath, const QString fileName);
void filesCreated(const QString parentPath, const QStringList fileNames);
void filesDeleted(const QString parentPath, const QStringList fileNames);
};
#endif // QKFILEWATCHER_H
To copy to clipboard, switch view to plain text mode
qkFileWatcher.cpp part1 :
#include "qkFileWatcher.h"
// Qt includes
#include <qtimer>
// qk includes
#include <qkFileController.h>
//=============================================================================
// qkFileWatch
//=============================================================================
qkFileWatch
::qkFileWatch(FileType type,
const QString & path, qkFileWatcher
* watcher
){
mWatcher = watcher;
mPath = path;
mAbsolutePath = info.absolutePath();
mName = info.fileName();
mType = type;
mSize = -1;
refreshDate();
}
qkFileWatch
::qkFileWatch(const QString & path, qkFileWatcher
* watcher
){
mWatcher = watcher;
mPath = path;
mAbsolutePath = info.absolutePath();
mName = info.fileName();
mType = fileType;
mSize = -1;
refreshDate();
}
qkFileWatch::qkFileWatch(qkFileWatcher * watcher)
{
mWatcher = watcher;
mType = invalidType;
mSize = -1;
refreshDate();
}
//=============================================================================
void qkFileWatch
::request_fileModified(const QString parentPath,
const QString fileName
) {
mWatcher->request_fileModified(parentPath, fileName);
}
void qkFileWatch
::request_filesCreated(const QString parentPath,
const QStringList fileNames
) {
mWatcher->request_filesCreated(parentPath, fileNames);
}
void qkFileWatch
::request_filesDeleted(const QString parentPath,
const QStringList fileNames
) {
mWatcher->request_filesDeleted(parentPath, fileNames);
}
//=============================================================================
void qkFileWatch
::request_folderModified(const QString parentPath,
const QString folderName
) {
mWatcher->request_folderModified(parentPath, folderName);
}
void qkFileWatch
::request_foldersCreated(const QString parentPath,
const QStringList folderNames
) {
mWatcher->request_foldersCreated(parentPath, folderNames);
}
void qkFileWatch
::request_foldersDeleted(const QString parentPath,
const QStringList folderNames
) {
mWatcher->request_foldersDeleted(parentPath, folderNames);
}
//=============================================================================
void qkFileWatch::refreshDate()
{
if (info.exists() == false)
{
qkDebug("Deleted %s !", mPath.C_STR);
mSize = -1;
return;
}
mSize = info.size();
mLastModified = info.lastModified();
}
/* virtual */ void qkFileWatch::checkChange()
{
qint64 oldSize = mSize;
refreshDate();
// We check both modified date and size for greater precision
if (oldModified < mLastModified || oldSize != mSize)
{
if (mType == qkFileWatch::folderType)
{
request_folderModified(mAbsolutePath, mName);
}
else if (mType == qkFileWatch::fileType)
{
request_fileModified(mAbsolutePath, mName);
}
}
}
//=============================================================================
QString qkFileWatch
::path() const { return mPath;
}
QString qkFileWatch
::absolutePath() const { return mAbsolutePath;
}
QString qkFileWatch
::name() const { return mName;
}
bool qkFileWatch::isValid() const
{
if (mType == invalidType) return false;
else return true;
}
bool qkFileWatch::isFile() const
{
if (mType == fileType) return true;
else return false;
}
bool qkFileWatch::isDirectory() const
{
if (mType == folderType) return true;
else return false;
}
bool qkFileWatch::exists() const
{
if (mSize == -1) return false;
else return true;
}
qkFileWatch::FileType qkFileWatch::type() const
{
return mType;
}
//=============================================================================
// qkFolderWatch
//=============================================================================
qkFolderWatch
::qkFolderWatch(const QString & path, qkFileWatcher
* watcher
) : qkFileWatch(folderType, path, watcher)
{
recurseDirectories();
}
//=============================================================================
bool qkFolderWatch
::contains(const QString & path
) {
for (int i = 0; i < mFolderWatchs.size(); i++)
{
if (mFolderWatchs[i].path() == path) return true;
}
for (int i = 0; i < mFileWatchs.size(); i++)
{
if (mFileWatchs[i].path() == path) return true;
}
return false;
}
void qkFolderWatch::checkChange()
{
qkFileWatch::checkChange();
// Checking all sub-directories
for (int i = 0; i < mFolderWatchs.size(); i++)
{
mFolderWatchs[i].checkChange();
}
// Note: on windows we have to check files even if the directory has not changed
for (int i = 0; i < mFileWatchs.size(); i++)
{
mFileWatchs[i].checkChange();
}
// Checking files only if the directory has been modified
if (oldModified != mLastModified)
{
// Checking for deleted files
checkDeleted();
// Recurse for new files
recurseDirectories();
}
}
#include "qkFileWatcher.h"
// Qt includes
#include <qtimer>
// qk includes
#include <qkFileController.h>
//=============================================================================
// qkFileWatch
//=============================================================================
qkFileWatch::qkFileWatch(FileType type, const QString & path, qkFileWatcher * watcher)
{
QFileInfo info(path);
mWatcher = watcher;
mPath = path;
mAbsolutePath = info.absolutePath();
mName = info.fileName();
mType = type;
mSize = -1;
refreshDate();
}
qkFileWatch::qkFileWatch(const QString & path, qkFileWatcher * watcher)
{
QFileInfo info(path);
mWatcher = watcher;
mPath = path;
mAbsolutePath = info.absolutePath();
mName = info.fileName();
mType = fileType;
mSize = -1;
refreshDate();
}
qkFileWatch::qkFileWatch(qkFileWatcher * watcher)
{
mWatcher = watcher;
mType = invalidType;
mSize = -1;
refreshDate();
}
//=============================================================================
void qkFileWatch::request_fileModified(const QString parentPath, const QString fileName)
{
mWatcher->request_fileModified(parentPath, fileName);
}
void qkFileWatch::request_filesCreated(const QString parentPath, const QStringList fileNames)
{
mWatcher->request_filesCreated(parentPath, fileNames);
}
void qkFileWatch::request_filesDeleted(const QString parentPath, const QStringList fileNames)
{
mWatcher->request_filesDeleted(parentPath, fileNames);
}
//=============================================================================
void qkFileWatch::request_folderModified(const QString parentPath, const QString folderName)
{
mWatcher->request_folderModified(parentPath, folderName);
}
void qkFileWatch::request_foldersCreated(const QString parentPath, const QStringList folderNames)
{
mWatcher->request_foldersCreated(parentPath, folderNames);
}
void qkFileWatch::request_foldersDeleted(const QString parentPath, const QStringList folderNames)
{
mWatcher->request_foldersDeleted(parentPath, folderNames);
}
//=============================================================================
void qkFileWatch::refreshDate()
{
QFileInfo info(mPath);
if (info.exists() == false)
{
qkDebug("Deleted %s !", mPath.C_STR);
mSize = -1;
mLastModified = QDateTime();
return;
}
mSize = info.size();
mLastModified = info.lastModified();
}
/* virtual */ void qkFileWatch::checkChange()
{
QDateTime oldModified = mLastModified;
qint64 oldSize = mSize;
refreshDate();
// We check both modified date and size for greater precision
if (oldModified < mLastModified || oldSize != mSize)
{
if (mType == qkFileWatch::folderType)
{
request_folderModified(mAbsolutePath, mName);
}
else if (mType == qkFileWatch::fileType)
{
request_fileModified(mAbsolutePath, mName);
}
}
}
//=============================================================================
QString qkFileWatch::path() const { return mPath; }
QString qkFileWatch::absolutePath() const { return mAbsolutePath; }
QString qkFileWatch::name() const { return mName; }
bool qkFileWatch::isValid() const
{
if (mType == invalidType) return false;
else return true;
}
bool qkFileWatch::isFile() const
{
if (mType == fileType) return true;
else return false;
}
bool qkFileWatch::isDirectory() const
{
if (mType == folderType) return true;
else return false;
}
bool qkFileWatch::exists() const
{
if (mSize == -1) return false;
else return true;
}
qkFileWatch::FileType qkFileWatch::type() const
{
return mType;
}
//=============================================================================
// qkFolderWatch
//=============================================================================
qkFolderWatch::qkFolderWatch(const QString & path, qkFileWatcher * watcher)
: qkFileWatch(folderType, path, watcher)
{
recurseDirectories();
}
//=============================================================================
bool qkFolderWatch::contains(const QString & path)
{
for (int i = 0; i < mFolderWatchs.size(); i++)
{
if (mFolderWatchs[i].path() == path) return true;
}
for (int i = 0; i < mFileWatchs.size(); i++)
{
if (mFileWatchs[i].path() == path) return true;
}
return false;
}
void qkFolderWatch::checkChange()
{
QDateTime oldModified = mLastModified;
qkFileWatch::checkChange();
// Checking all sub-directories
for (int i = 0; i < mFolderWatchs.size(); i++)
{
mFolderWatchs[i].checkChange();
}
// Note: on windows we have to check files even if the directory has not changed
for (int i = 0; i < mFileWatchs.size(); i++)
{
mFileWatchs[i].checkChange();
}
// Checking files only if the directory has been modified
if (oldModified != mLastModified)
{
// Checking for deleted files
checkDeleted();
// Recurse for new files
recurseDirectories();
}
}
To copy to clipboard, switch view to plain text mode
Bookmarks