فهرست منبع

Fix recursive scanning of directories

ForeachDirectoryEntry didn't actually do anything with the `recursive`
parameter, and the corresponding callback parameter was shadowing the
actual recursion counters in the user functions.
Yuri Kunde Schlesner 10 سال پیش
والد
کامیت
d6792632f0
3فایلهای تغییر یافته به همراه15 افزوده شده و 22 حذف شده
  1. 3 5
      src/citra_qt/game_list.cpp
  2. 10 12
      src/common/file_util.cpp
  3. 2 5
      src/common/file_util.h

+ 3 - 5
src/citra_qt/game_list.cpp

@@ -120,11 +120,9 @@ void GameList::LoadInterfaceLayout()
 
 
 void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsigned int recursion)
 void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsigned int recursion)
 {
 {
-    const auto callback = [&](unsigned* num_entries_out,
-                              const std::string& directory,
-                              const std::string& virtual_name,
-                              unsigned int recursion) -> bool {
-
+    const auto callback = [this, recursion](unsigned* num_entries_out,
+                                            const std::string& directory,
+                                            const std::string& virtual_name) -> bool {
         std::string physical_name = directory + DIR_SEP + virtual_name;
         std::string physical_name = directory + DIR_SEP + virtual_name;
 
 
         if (stop_processing)
         if (stop_processing)

+ 10 - 12
src/common/file_util.cpp

@@ -434,7 +434,7 @@ bool CreateEmptyFile(const std::string &filename)
 }
 }
 
 
 
 
-bool ForeachDirectoryEntry(unsigned* num_entries_out, const std::string &directory, DirectoryEntryCallable callback, unsigned int recursion)
+bool ForeachDirectoryEntry(unsigned* num_entries_out, const std::string &directory, DirectoryEntryCallable callback)
 {
 {
     LOG_TRACE(Common_Filesystem, "directory %s", directory.c_str());
     LOG_TRACE(Common_Filesystem, "directory %s", directory.c_str());
 
 
@@ -472,7 +472,7 @@ bool ForeachDirectoryEntry(unsigned* num_entries_out, const std::string &directo
             continue;
             continue;
 
 
         unsigned ret_entries = 0;
         unsigned ret_entries = 0;
-        if (!callback(&ret_entries, directory, virtual_name, recursion)) {
+        if (!callback(&ret_entries, directory, virtual_name)) {
             callback_error = true;
             callback_error = true;
             break;
             break;
         }
         }
@@ -497,10 +497,9 @@ bool ForeachDirectoryEntry(unsigned* num_entries_out, const std::string &directo
 
 
 unsigned ScanDirectoryTree(const std::string &directory, FSTEntry& parent_entry, unsigned int recursion)
 unsigned ScanDirectoryTree(const std::string &directory, FSTEntry& parent_entry, unsigned int recursion)
 {
 {
-    const auto callback = [&parent_entry](unsigned* num_entries_out,
-                                          const std::string& directory,
-                                          const std::string& virtual_name,
-                                          unsigned int recursion) -> bool {
+    const auto callback = [recursion, &parent_entry](unsigned* num_entries_out,
+                                                     const std::string& directory,
+                                                     const std::string& virtual_name) -> bool {
         FSTEntry entry;
         FSTEntry entry;
         entry.virtualName = virtual_name;
         entry.virtualName = virtual_name;
         entry.physicalName = directory + DIR_SEP + virtual_name;
         entry.physicalName = directory + DIR_SEP + virtual_name;
@@ -526,16 +525,15 @@ unsigned ScanDirectoryTree(const std::string &directory, FSTEntry& parent_entry,
     };
     };
 
 
     unsigned num_entries;
     unsigned num_entries;
-    return ForeachDirectoryEntry(&num_entries, directory, callback, recursion) ? num_entries : 0;
+    return ForeachDirectoryEntry(&num_entries, directory, callback) ? num_entries : 0;
 }
 }
 
 
 
 
 bool DeleteDirRecursively(const std::string &directory, unsigned int recursion)
 bool DeleteDirRecursively(const std::string &directory, unsigned int recursion)
 {
 {
-    const static auto callback = [](unsigned* num_entries_out,
-                                    const std::string& directory,
-                                    const std::string& virtual_name,
-                                    unsigned int recursion) -> bool {
+    const auto callback = [recursion](unsigned* num_entries_out,
+                                      const std::string& directory,
+                                      const std::string& virtual_name) -> bool {
         std::string new_path = directory + DIR_SEP_CHR + virtual_name;
         std::string new_path = directory + DIR_SEP_CHR + virtual_name;
 
 
         if (IsDirectory(new_path)) {
         if (IsDirectory(new_path)) {
@@ -546,7 +544,7 @@ bool DeleteDirRecursively(const std::string &directory, unsigned int recursion)
         return Delete(new_path);
         return Delete(new_path);
     };
     };
 
 
-    if (!ForeachDirectoryEntry(nullptr, directory, callback, recursion))
+    if (!ForeachDirectoryEntry(nullptr, directory, callback))
         return false;
         return false;
 
 
     // Delete the outermost directory
     // Delete the outermost directory

+ 2 - 5
src/common/file_util.h

@@ -105,13 +105,11 @@ bool CreateEmptyFile(const std::string &filename);
  * @param num_entries_out to be assigned by the callable with the number of iterated directory entries, never null
  * @param num_entries_out to be assigned by the callable with the number of iterated directory entries, never null
  * @param directory the path to the enclosing directory
  * @param directory the path to the enclosing directory
  * @param virtual_name the entry name, without any preceding directory info
  * @param virtual_name the entry name, without any preceding directory info
- * @param recursion Number of children directory to read before giving up
  * @return whether handling the entry succeeded
  * @return whether handling the entry succeeded
  */
  */
 using DirectoryEntryCallable = std::function<bool(unsigned* num_entries_out,
 using DirectoryEntryCallable = std::function<bool(unsigned* num_entries_out,
                                                  const std::string& directory,
                                                  const std::string& directory,
-                                                 const std::string& virtual_name,
-                                                 unsigned int recursion)>;
+                                                 const std::string& virtual_name)>;
 
 
 /**
 /**
  * Scans a directory, calling the callback for each file/directory contained within.
  * Scans a directory, calling the callback for each file/directory contained within.
@@ -119,10 +117,9 @@ using DirectoryEntryCallable = std::function<bool(unsigned* num_entries_out,
  * @param num_entries_out assigned by the function with the number of iterated directory entries, can be null
  * @param num_entries_out assigned by the function with the number of iterated directory entries, can be null
  * @param directory the directory to scan
  * @param directory the directory to scan
  * @param callback The callback which will be called for each entry
  * @param callback The callback which will be called for each entry
- * @param recursion Number of children directories to read before giving up
  * @return whether scanning the directory succeeded
  * @return whether scanning the directory succeeded
  */
  */
-bool ForeachDirectoryEntry(unsigned* num_entries_out, const std::string &directory, DirectoryEntryCallable callback, unsigned int recursion = 0);
+bool ForeachDirectoryEntry(unsigned* num_entries_out, const std::string &directory, DirectoryEntryCallable callback);
 
 
 /**
 /**
  * Scans the directory tree, storing the results.
  * Scans the directory tree, storing the results.