aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElise <elisezerotwo@gmail.com>2020-03-25 17:17:54 +0100
committerGitHub <noreply@github.com>2020-03-25 17:17:54 +0100
commitd5670aff7721e710ad5f4157827d5716b82bc329 (patch)
tree917f3d63976a25933dc7cfeb10d4d7c5037cde46
parent1586450a38caabdfe62c10391c28f52f0c88372e (diff)
Fix unhandled UnauthorizedAccessException causing crash while listing… (#1025)
* Fix unhandled UnauthorizedAccessException causing crash while listing directories * Actually handle not having privileges for a directory * Fix log message when not having privileges for a directory * Remove unneccesary empty lines * Remove unneccecssary space
-rw-r--r--Ryujinx/Ui/ApplicationLibrary.cs46
1 files changed, 44 insertions, 2 deletions
diff --git a/Ryujinx/Ui/ApplicationLibrary.cs b/Ryujinx/Ui/ApplicationLibrary.cs
index fc3d6122..3ff7a54c 100644
--- a/Ryujinx/Ui/ApplicationLibrary.cs
+++ b/Ryujinx/Ui/ApplicationLibrary.cs
@@ -40,6 +40,47 @@ namespace Ryujinx.Ui
private static Language _desiredTitleLanguage;
private static bool _loadingError;
+ public static IEnumerable<string> GetFilesInDirectory(string directory)
+ {
+ Stack<string> stack = new Stack<string>();
+ stack.Push(directory);
+ while (stack.Count > 0)
+ {
+ string dir = stack.Pop();
+ string[] content = { };
+
+ try
+ {
+ content = Directory.GetFiles(dir, "*");
+ }
+ catch (UnauthorizedAccessException)
+ {
+ Logger.PrintWarning(LogClass.Application, $"Failed to get access to directory: \"{dir}\"");
+ }
+
+ if (content.Length > 0)
+ {
+ foreach (string file in content)
+ yield return file;
+ }
+
+ try
+ {
+ content = Directory.GetDirectories(dir);
+ }
+ catch (UnauthorizedAccessException)
+ {
+ Logger.PrintWarning(LogClass.Application, $"Failed to get access to directory: \"{dir}\"");
+ }
+
+ if (content.Length > 0)
+ {
+ foreach (string subdir in content)
+ stack.Push(subdir);
+ }
+ }
+ }
+
public static void LoadApplications(List<string> appDirs, VirtualFileSystem virtualFileSystem, Language desiredTitleLanguage)
{
int numApplicationsFound = 0;
@@ -53,6 +94,7 @@ namespace Ryujinx.Ui
List<string> applications = new List<string>();
foreach (string appDir in appDirs)
{
+
if (!Directory.Exists(appDir))
{
Logger.PrintWarning(LogClass.Application, $"The \"game_dirs\" section in \"Config.json\" contains an invalid directory: \"{appDir}\"");
@@ -60,10 +102,10 @@ namespace Ryujinx.Ui
continue;
}
- foreach (string app in Directory.GetFiles(appDir, "*.*", SearchOption.AllDirectories))
+ foreach (string app in GetFilesInDirectory(appDir))
{
if ((Path.GetExtension(app).ToLower() == ".nsp") ||
- (Path.GetExtension(app).ToLower() == ".pfs0")||
+ (Path.GetExtension(app).ToLower() == ".pfs0") ||
(Path.GetExtension(app).ToLower() == ".xci") ||
(Path.GetExtension(app).ToLower() == ".nca") ||
(Path.GetExtension(app).ToLower() == ".nro") ||