From 057be0294aae40bb39bcfbec51c777489b5ab1a3 Mon Sep 17 00:00:00 2001 From: Andrew Senetar Date: Wed, 11 Jan 2023 23:07:06 -0600 Subject: [PATCH] fix: Prevent exception during existence check - Add "safe" existence check to files which catches OSErrors that may occur when trying to stat files - Use "safe" existence check during final existence check --- core/fs.py | 8 ++++++++ core/scanner.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/core/fs.py b/core/fs.py index 6d37fb83..11a29a20 100644 --- a/core/fs.py +++ b/core/fs.py @@ -315,6 +315,14 @@ class File: """Returns whether this file wrapper class can handle ``path``.""" return not path.is_symlink() and path.is_file() + def exists(self) -> bool: + """Safely check if the underlying file exists, treat error as non-existent""" + try: + return self.path.exists() + except OSError as ex: + logging.warning(f"Checking {self.path} raised: {ex}") + return False + def rename(self, newname): if newname == self.name: return diff --git a/core/scanner.py b/core/scanner.py index 72550497..67124f20 100644 --- a/core/scanner.py +++ b/core/scanner.py @@ -172,7 +172,7 @@ class Scanner: if not self.mix_file_kind: matches = [m for m in matches if get_file_ext(m.first.name) == get_file_ext(m.second.name)] if self.include_exists_check: - matches = [m for m in matches if m.first.path.exists() and m.second.path.exists()] + matches = [m for m in matches if m.first.exists() and m.second.exists()] matches = [m for m in matches if not (m.first.is_ref and m.second.is_ref)] if ignore_list: matches = [m for m in matches if not ignore_list.are_ignored(str(m.first.path), str(m.second.path))]