diff --git a/repertory/librepertory/src/providers/base_provider.cpp b/repertory/librepertory/src/providers/base_provider.cpp index 87db127f..48d57ead 100644 --- a/repertory/librepertory/src/providers/base_provider.cpp +++ b/repertory/librepertory/src/providers/base_provider.cpp @@ -440,6 +440,39 @@ void base_provider::remove_deleted_files() { static_cast(__FUNCTION__), }; + auto source_list = + utils::file::directory{config_.get_cache_directory()}.get_files(); + for (auto &&source_file : source_list) { + filesystem_item fsi{}; + auto sp_res = + get_filesystem_item_from_source_path(source_file->get_path(), fsi); + if (sp_res != api_error::item_not_found) { + continue; + } + + auto reference_time = + source_file->get_time(config_.get_eviction_uses_accessed_time() + ? utils::file::time_type::accessed + : utils::file::time_type::modified); + if (not reference_time.has_value()) { + continue; + } + + auto delay = (config_.get_eviction_delay_mins() * 60UL) * + utils::time::NANOS_PER_SECOND; + if ((reference_time.value() + static_cast(delay)) >= + utils::time::get_time_now()) { + continue; + } + + event_system::instance().raise( + source_file->get_path()); + if (source_file->remove()) { + event_system::instance().raise( + source_file->get_path()); + } + } + struct removed_item { std::string api_path{}; bool directory{}; @@ -500,7 +533,7 @@ void base_provider::remove_deleted_files() { utils::error::raise_error( function_name, std::to_string(utils::get_last_error_code()), "failed to create orphaned directory|sp|" + orphaned_directory); - break; + continue; } const auto parts = utils::string::split(item.api_path, '/', false); @@ -545,38 +578,6 @@ void base_provider::remove_deleted_files() { event_system::instance().raise( item.api_path, item.source_path); } - - auto source_list = - utils::file::directory{config_.get_cache_directory()}.get_files(); - for (auto &&source_file : source_list) { - filesystem_item fsi{}; - if (get_filesystem_item_from_source_path(source_file->get_path(), fsi) != - api_error::item_not_found) { - continue; - } - - auto reference_time = - source_file->get_time(config_.get_eviction_uses_accessed_time() - ? utils::file::time_type::accessed - : utils::file::time_type::modified); - if (not reference_time.has_value()) { - continue; - } - - auto delay = (config_.get_eviction_delay_mins() * 60UL) * - utils::time::NANOS_PER_SECOND; - if ((reference_time.value() + static_cast(delay)) <= - utils::time::get_time_now()) { - continue; - } - - event_system::instance().raise( - source_file->get_path()); - if (source_file->remove()) { - event_system::instance().raise( - source_file->get_path()); - } - } } auto base_provider::remove_file(const std::string &api_path) -> api_error { @@ -705,6 +706,8 @@ auto base_provider::start(api_item_added_callback api_item_added, } if (online && not unmount_requested) { + remove_deleted_files(); + polling::instance().set_callback({"check_deleted", polling::frequency::low, [this]() { remove_deleted_files(); }}); return true;