Skip to content

Commit 1f1ccf6

Browse files
committed
fix DirectoryWatcher with multiple directories
1 parent ae13f63 commit 1f1ccf6

File tree

1 file changed

+16
-12
lines changed

1 file changed

+16
-12
lines changed

Core/src/DirectoryWatcher.cpp

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include "Core/Directory.hpp"
44
#include "Core/DirectoryWatcher.hpp"
55

6+
#include "Core/Log.hpp"
7+
68
#include <QDateTime>
79
#include <QDir>
810
#include <QFileInfo>
@@ -86,19 +88,19 @@ void DirectoryWatcher::OnDirectoryChanged(const QString& path)
8688
emit DirectoryChanged(path.toStdString());
8789

8890
const QDir dir(path);
89-
const QFileInfoList watchedList = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Files);
91+
const QFileInfoList files = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Files);
9092

91-
std::unordered_set<QString> missing(m_lastModified.size());
92-
for (const auto& file : m_lastModified | std::views::keys)
93-
missing.insert(file);
93+
auto beforeFiles = m_lastModified | std::views::keys | std::views::filter([&path](const QString& m) -> bool
94+
{
95+
return m.startsWith(path);
96+
}) | std::ranges::to<std::unordered_set<QString>>();
9497

95-
for (const QFileInfo& fileInfo : watchedList)
98+
for (const QFileInfo& fileInfo : files)
9699
{
97-
QString filePath = fileInfo.absoluteFilePath();
98-
QDateTime lastModified = fileInfo.lastModified();
100+
const QString filePath = fileInfo.absoluteFilePath();
101+
const QDateTime lastModified = fileInfo.lastModified();
99102

100-
const bool contains = m_lastModified.contains(filePath);
101-
if (!contains || m_lastModified[filePath] < lastModified)
103+
if (!m_lastModified.contains(filePath) || m_lastModified[filePath] < lastModified)
102104
{
103105
m_lastModified[filePath] = lastModified;
104106
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
@@ -108,13 +110,15 @@ void DirectoryWatcher::OnDirectoryChanged(const QString& path)
108110
#endif
109111
}
110112

111-
if (missing.contains(filePath))
113+
// remove it from the list if it still exists
114+
if (beforeFiles.contains(filePath))
112115
{
113-
missing.erase(filePath);
116+
beforeFiles.erase(filePath);
114117
}
115118
}
116119

117-
for (const QString& file : missing)
120+
// these files were removed
121+
for (const QString& file : beforeFiles)
118122
{
119123
m_lastModified.erase(file);
120124
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)

0 commit comments

Comments
 (0)