From aff5f8916b50f458a066306f757e44557542c192 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 25 Jun 2023 22:34:47 +0200 Subject: Tolerate problems when reading the contents of DCPs. This avoids errors in cases like unreadable lost+found directories appearing inside a DCP. --- src/lib/dcp_content.cc | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'src/lib/dcp_content.cc') diff --git a/src/lib/dcp_content.cc b/src/lib/dcp_content.cc index e2b19fb8e..442b5bd40 100644 --- a/src/lib/dcp_content.cc +++ b/src/lib/dcp_content.cc @@ -50,6 +50,7 @@ using std::cout; using std::dynamic_pointer_cast; +using std::exception; using std::function; using std::list; using std::make_shared; @@ -197,16 +198,20 @@ DCPContent::read_sub_directory (boost::filesystem::path p) using namespace boost::filesystem; LOG_GENERAL ("DCPContent::read_sub_directory reads %1", p.string()); - for (auto i: directory_iterator(p)) { - if (is_regular_file(i.path())) { - LOG_GENERAL ("Inside there's regular file %1", i.path().string()); - add_path (i.path()); - } else if (is_directory(i.path()) && i.path().filename() != ".AppleDouble") { - LOG_GENERAL ("Inside there's directory %1", i.path().string()); - read_sub_directory (i.path()); - } else { - LOG_GENERAL("Ignoring %1 from inside: status is %2", i.path().string(), static_cast(status(i.path()).type())); + try { + for (auto i: directory_iterator(p)) { + if (is_regular_file(i.path())) { + LOG_GENERAL ("Inside there's regular file %1", i.path().string()); + add_path (i.path()); + } else if (is_directory(i.path()) && i.path().filename() != ".AppleDouble") { + LOG_GENERAL ("Inside there's directory %1", i.path().string()); + read_sub_directory (i.path()); + } else { + LOG_GENERAL("Ignoring %1 from inside: status is %2", i.path().string(), static_cast(status(i.path()).type())); + } } + } catch (exception& e) { + LOG_GENERAL("Failed to iterate over %1: %2", p.string(), e.what()); } } -- cgit v1.2.3