Rev 2702 |
Rev 3359 |
Go to most recent revision |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
#include "filewatcher.h"
#include "filewatcher.moc"
#include "scconfig.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef _WIN32
#include <windows.h>
#endif
FileWatcher::FileWatcher( QWidget* parent) : QObject(parent)
{
watchedFiles.clear();
watchTimer = new QTimer(this);
connect(watchTimer, SIGNAL(timeout()), this, SLOT(checkFiles()));
watchTimer->start(10000, true);
blockAddRemove = false;
}
FileWatcher::~FileWatcher()
{
watchTimer->stop();
disconnect(watchTimer, SIGNAL(timeout()), this, SLOT(checkFiles()));
watchedFiles.clear();
delete watchTimer;
}
void FileWatcher::addFile(QString fileName)
{
watchTimer->stop();
if (!watchedFiles.contains(fileName))
{
struct fileMod fi;
fi.info = QFileInfo(fileName);
fi.timeInfo = fi.info.lastModified();
watchedFiles.insert(fileName, fi);
}
watchTimer->start(10000, true);
}
void FileWatcher::removeFile(QString fileName)
{
watchTimer->stop();
watchedFiles.remove(fileName);
watchTimer->start(10000, true);
}
void FileWatcher::addDir(QString fileName)
{
addFile(fileName);
}
void FileWatcher::removeDir(QString fileName)
{
removeFile(fileName);
}
void FileWatcher::start()
{
watchTimer->stop();
watchTimer->start(10000, true);
}
void FileWatcher::stop()
{
watchTimer->stop();
}
void FileWatcher::forceScan()
{
checkFiles();
}
bool FileWatcher::isActive()
{
return blockAddRemove;
}
QValueList<QString> FileWatcher::files()
{
return watchedFiles.keys();
}
void FileWatcher::checkFiles()
{
blockAddRemove = true;
watchTimer->stop();
QDateTime time;
QMap<QString, fileMod>::Iterator it;
for ( it = watchedFiles.begin(); it != watchedFiles.end(); ++it )
{
it.data().info.refresh();
if (!it.data().info.exists())
{
if (it.data().info.isDir())
emit dirDeleted(it.key());
else
emit fileDeleted(it.key());
watchedFiles.remove(it);
continue;
}
time = it.data().info.lastModified();
if (time != it.data().timeInfo)
{
if (it.data().info.isDir())
emit dirChanged(it.key());
else
{
uint sizeo = it.data().info.size();
#ifndef _WIN32
usleep(100);
#else
Sleep(1);
#endif
it.data().info.refresh();
uint sizen = it.data().info.size();
while (sizen != sizeo)
{
sizeo = sizen;
#ifndef _WIN32
usleep(100);
#else
Sleep(1);
#endif
it.data().info.refresh();
sizen = it.data().info.size();
}
it.data().timeInfo = time;
emit fileChanged(it.key());
}
}
}
blockAddRemove = false;
watchTimer->start(10000, true);
}