mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	Merge pull request #1923 from yuriks/fix-recursive
Fix recursive scanning of directories
This commit is contained in:
		
						commit
						4d31874c7c
					
				
					 3 changed files with 15 additions and 22 deletions
				
			
		|  | @ -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 auto callback = [this, recursion](unsigned* num_entries_out, | ||||||
|                               const std::string& directory, |                                             const std::string& directory, | ||||||
|                               const std::string& virtual_name, |                                             const std::string& virtual_name) -> bool { | ||||||
|                               unsigned int recursion) -> 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) | ||||||
|  |  | ||||||
|  | @ -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 auto callback = [recursion, &parent_entry](unsigned* num_entries_out, | ||||||
|                                           const std::string& directory, |                                                      const std::string& directory, | ||||||
|                                           const std::string& virtual_name, |                                                      const std::string& virtual_name) -> bool { | ||||||
|                                           unsigned int recursion) -> 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 auto callback = [recursion](unsigned* num_entries_out, | ||||||
|                                     const std::string& directory, |                                       const std::string& directory, | ||||||
|                                     const std::string& virtual_name, |                                       const std::string& virtual_name) -> bool { | ||||||
|                                     unsigned int recursion) -> 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
 | ||||||
|  |  | ||||||
|  | @ -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, |                                                  const std::string& virtual_name)>; | ||||||
|                                                  unsigned int recursion)>; |  | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * 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. | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue