diff options
Diffstat (limited to 'qdeduper/filescanner.cpp')
-rw-r--r-- | qdeduper/filescanner.cpp | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/qdeduper/filescanner.cpp b/qdeduper/filescanner.cpp index e7e45fc..141cfbf 100644 --- a/qdeduper/filescanner.cpp +++ b/qdeduper/filescanner.cpp @@ -6,9 +6,8 @@ using std::size_t; -FileScanner::FileScanner() : QObject(nullptr), maxmnlen(0) +FileScanner::FileScanner() : QObject(nullptr), maxmnlen(0), interrpt(false) { - } void FileScanner::add_magic_number(const std::string &m) @@ -24,9 +23,13 @@ void FileScanner::add_path(const fs::path &p, bool recurse) } template <class T> -void dirit_foreach(T iter, std::function<void(const fs::directory_entry& p)> f) +void dirit_foreach(T iter, std::function<void(const fs::directory_entry& p)> f, std::atomic<bool> *inter) { - std::for_each(fs::begin(iter), fs::end(iter), f); + for(auto &e : iter) + { + if (inter->load()) break; + f(e); + } } void FileScanner::scan() @@ -57,18 +60,29 @@ void FileScanner::scan() bool recurse; std::tie(p, recurse) = pe; if (recurse) - dirit_foreach(fs::recursive_directory_iterator(p, opt), f); + dirit_foreach(fs::recursive_directory_iterator(p, opt), f, &interrpt); else - dirit_foreach(fs::directory_iterator(p, opt), f); + dirit_foreach(fs::directory_iterator(p, opt), f, &interrpt); } }; for_all_paths(count_files); + if (interrpt.load()) return; Q_EMIT scan_done_prep(fcnt); fcnt = 0; for_all_paths(scan_file); } +void FileScanner::interrupt() +{ + interrpt.store(true); +} + +bool FileScanner::interrupted() +{ + return interrpt.load(); +} + std::vector<fs::path> FileScanner::file_list() { return ret; |