mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +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) | ||||
| { | ||||
|     const auto callback = [&](unsigned* num_entries_out, | ||||
|     const auto callback = [this, recursion](unsigned* num_entries_out, | ||||
|                                             const std::string& directory, | ||||
|                               const std::string& virtual_name, | ||||
|                               unsigned int recursion) -> bool { | ||||
| 
 | ||||
|                                             const std::string& virtual_name) -> bool { | ||||
|         std::string physical_name = directory + DIR_SEP + virtual_name; | ||||
| 
 | ||||
|         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()); | ||||
| 
 | ||||
|  | @ -472,7 +472,7 @@ bool ForeachDirectoryEntry(unsigned* num_entries_out, const std::string &directo | |||
|             continue; | ||||
| 
 | ||||
|         unsigned ret_entries = 0; | ||||
|         if (!callback(&ret_entries, directory, virtual_name, recursion)) { | ||||
|         if (!callback(&ret_entries, directory, virtual_name)) { | ||||
|             callback_error = true; | ||||
|             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) | ||||
| { | ||||
|     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& virtual_name, | ||||
|                                           unsigned int recursion) -> bool { | ||||
|                                                      const std::string& virtual_name) -> bool { | ||||
|         FSTEntry entry; | ||||
|         entry.virtualName = 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; | ||||
|     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) | ||||
| { | ||||
|     const static auto callback = [](unsigned* num_entries_out, | ||||
|     const auto callback = [recursion](unsigned* num_entries_out, | ||||
|                                       const std::string& directory, | ||||
|                                     const std::string& virtual_name, | ||||
|                                     unsigned int recursion) -> bool { | ||||
|                                       const std::string& virtual_name) -> bool { | ||||
|         std::string new_path = directory + DIR_SEP_CHR + virtual_name; | ||||
| 
 | ||||
|         if (IsDirectory(new_path)) { | ||||
|  | @ -546,7 +544,7 @@ bool DeleteDirRecursively(const std::string &directory, unsigned int recursion) | |||
|         return Delete(new_path); | ||||
|     }; | ||||
| 
 | ||||
|     if (!ForeachDirectoryEntry(nullptr, directory, callback, recursion)) | ||||
|     if (!ForeachDirectoryEntry(nullptr, directory, callback)) | ||||
|         return false; | ||||
| 
 | ||||
|     // 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 directory the path to the enclosing directory | ||||
|  * @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 | ||||
|  */ | ||||
| using DirectoryEntryCallable = std::function<bool(unsigned* num_entries_out, | ||||
|                                                  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. | ||||
|  | @ -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 directory the directory to scan | ||||
|  * @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 | ||||
|  */ | ||||
| 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. | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue