joacampb
joacampb

Reputation: 177

using QFileSystemWatcher::Files() to get file count of watched folder example? count is always 0?

I have tried to figure this out over the weekend, but to no avail. I cant seem to find an example using QFileSystemWatcher::Files() directly so i thought i would ask.

I have a program that :

  1. lets the user select a 'source' folder.
  2. press a button to start watching that source folder for new files
  3. there is a signal emitted using 'directoryChanged()' where i try to update the count every time a file is added or removed.

I will profess that my implementation of QfileSystemWatcher is probably not correct. but this code is working and does trigger the signal/slot. but the count is always zero...

from mainwindow.cpp...

the signal:

//connect push buttons
QObject::connect(ui->startButton, SIGNAL(clicked()),
                 this, SLOT(startButtonClicked()));

//link qfilesystemwatcher with signals and slots
    QObject::connect(&hotfolder, SIGNAL(directoryChanged(QString)), this, SLOT(hotfolderChanged()));

the slots:

void MainWindow::startButtonClicked(){

  //start the file system watcher using the 'source folder button'
   //first, get the resulting text from the source folder button
   QString sourceText = ui->sourceBtnLineEdit->text();
   ui->statusbar->showMessage(sourceText);

   //convert the text from source button to a standard string.
   string filePath = sourceText.toStdString();
   cout << filePath << endl;

   //call method to add source path to qfilesystemwatcher
   startWatching(sourceText);

}

void MainWindow::hotfolderChanged(){

    int fileCount = filesWatched();
    ui->statusbar->showMessage(QString::number(fileCount));

}

from magickWatcher.h

#ifndef MAGICKWATCHER_H
#define MAGICKWATCHER_H

#include <QFileSystemWatcher>
#include <mainwindow.h>

//create the qFileSystemWatcher
QFileSystemWatcher hotfolder;

//add folder to qfilesystemwatcher
//starts watching of folder path
int startWatching( QString folder){

    hotfolder.addPath(folder);
    cout << "hotfolder created!" << endl;
    return 0;
}

//get file list of folder being watched
int filesWatched(){
    QStringList watchedList = hotfolder.files();

    //report out each line of file list
    for (int i = 0; i < watchedList.size(); ++i){
             cout << watchedList.at(i).toStdString() << endl;
             cout << "is this looping?!!" << endl;
    }
    return watchedList.count();
}


#endif // MAGICKWATCHER_H

How can i use QFileSystemWatcher to get the file count of the watched folder? I know about QDir and its options but want to specifically know how to use QFileSystemWatcher.

I am still wrapping my head around c++ in general so thank you for any advice or tips as well. I think maybe my problem is how i am implementing QFileSystemWatcher.

Some relevant links i have used:

QFileSystemWatcher working only in main()

http://doc.qt.io/qt-5/qfilesystemwatcher.html#files

Upvotes: 0

Views: 1161

Answers (2)

talamaki
talamaki

Reputation: 5472

You can get information about files in the watched directory e.g. by using QDir::entryInfoList with filters applicable in your case. At least QDir::Files and possibly QDir::NoDotAndDotDot would make sense.

//get file list of folder being watched
int filesWatched() {
    QString folder = "/path/to/hotfolder/";
    QDir monitoredFolder(folder);
    QFileInfoList watchedList = 
        monitoredFolder.entryInfoList(QDir::NoDotAndDotDot | QDir::Files);

    QListIterator<QFileInfo> iterator(watchedList);
    while (iterator.hasNext())
    {
        QFileInfo file_info = iterator.next();
        qDebug() << "File path:" << file_info.absoluteFilePath();
    }

    return watchedList.count();
}

Upvotes: 1

frogatto
frogatto

Reputation: 29285

First let's have a closer look at docs (bold format is mine):

QFileSystemWatcher examines each path added to it. Files that have been added to the QFileSystemWatcher can be accessed using the files() function, and directories using the directories() function.

So, files() only returns a list of files which you have already added to the watcher using addPath() method, NOT a list of files implicitly being watched by adding a directory.

Upvotes: 1

Related Questions