从包含更改内容的文件夹中删除文件

时间:2014-03-31 17:00:03

标签: c++ multithreading qt file delete-file

我有一个主线程和一个处理一些文件的线程。当主线程监视的文件夹发生更改时,会向处理线程发送信号以启动。处理完文件后,我希望将其删除,然后让文件夹检查文件夹中是否还有其他文件。如果有则重复该过程。

我的问题在于重复检查文件夹。在处理线程上。该功能列在下面的代码中,问题是我无法从文件夹中删除文件。我很困难,所以任何投入都值得赞赏。

在dataprocessor.h

...
QList<QString> justProcessed;
...

在dataprocessor.cpp中

void DataProcessor::onSignal() {
// Will keep running as long as there are files in the spool folder, eating it's way through
bool stillFiles = true;

QDir dir(this->monitoredPath);
dir.setFilter(QDir::Files | QDir::NoDotAndDotDot);
dir.setSorting(QDir::Time);

while(stillFiles) {

    // Have to update on each iteration, since the folder changes.
    dir.refresh();

    QFileInfoList fileList = dir.entryInfoList();
    QString activeFile = "";

    foreach(QFileInfo file, fileList) {

        if((file.suffix() == "txt") && !justProcessed.contains(file.fileName())) {
            // Is a text file. Set for processing and break foreach loop
            activeFile = file.fileName();
            break;
        }

    }

    // If none of the files passed the requirements, then there are no more spl files in the folder.
    qDebug() << activeFile;
    if(activeFile == "") {
        qDebug() << "Finished";
        emit finished();
        stillFiles = false;
    }

    // File is a new file, start processing
    qDebug() << "Selected for processing";
    qDebug() << monitoredPath + "/" + activeFile;
    if(!dir.remove(monitoredPath + "/" + activeFile)) qDebug() << "Could not remove file";

    justProcessed.append(activeFile);

} // While end
}

如果我错过了提供一些信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

问题原来是两个问题。其中一个问题是系统太快,因此在读取和删除系统的同时删除文件。我通过添加QTimer解决了这个问题,每次触发来自受监视文件夹的信号时都会重置该QTimer。从最后一次更换系统起500ms就足够了。而不是继续使用QFileSystemWatcher读取此文件夹中的文件并将其添加到队列中,就像我最初一样,我创建了一个函数来处理文件夹中的文件时使系统观察器静音。为了补偿文件观察器的功能,我在处理线程中创建了一个递归循环,这样只要还有文件,它就会继续读取指定的文件。这可以在一个线程中完成。你们都谈论代码,所以这里是:

信号和插槽设置

// Setting up folder monitoring.
watcher.addPath(worker->monitoredPath);
QObject::connect(&watcher, SIGNAL(directoryChanged(QString)), this,
SLOT(updateQueue()));
// Timer
connect(timer, SIGNAL(timeout()), this, SLOT(startProcess()));
connect(this, SIGNAL(processRequest()), thread, SLOT(start()));
...

void MainWindow::updateQueue() {
  // Starts or restarts the call to start process. Prevents multiple signals from
  // many files added at once
  timer->start(500);
}
...
void MainWindow::startProcess() {

  if(!thread->isRunning()) {
    emit processRequest();
    muteWatcher(true);  // From here on a recursive loop in dataprocessor checks
                        // the folder for new files.
  }
  timer->stop();

}

静音文件观察器

void MainWindow::muteWatcher(bool toggle) {
  if(toggle) {
    watcher.removePath(worker->monitoredPath);
  } else {
    watcher.addPath(worker->monitoredPath);
  }
}

处理线程

void DataProcessor::initialize() {
  QDir dir(this->monitoredPath);
  dir.setFilter(QDir::NoDotAndDotDot | QDir::Files);
  dir.setSorting(QDir::Time);

  QList<QString> dFiles;

  foreach(QFileInfo file, dir.entryInfoList()) {

    if(file.suffix().toLower() == "txt") {
        dFiles.append(file.fileName());
    }
  }

  if(dFiles.count() == 0) { // Base case
    emit muteWatcher(false); // Start monitoring the folder again
    emit finished(); // end the thread
    return true;
  }

  // PROCESSING HERE

  initializeLabel();

}

接下来要去的是我打印到的打印机的首选项,以防止此打印机将假脱机文件添加到该文件夹​​。您可以通过单击“直接打印到打印机”来启用此功能。这解决了我的大多数问题,并且我能够删除我创建的延迟网络,以便使程序不会阅读打印机生成的文件。

希望这有助于某人!