Properly catch exceptions in LocalFileSystem.CleanDirectoryRecursively

This commit is contained in:
Alex Barney 2021-08-20 15:57:19 -07:00
parent 8df2007b1a
commit 489ad0fb8a

View file

@ -309,35 +309,10 @@ namespace LibHac.FsSystem
Result rc = ResolveFullPath(out string fullPath, path, true); Result rc = ResolveFullPath(out string fullPath, path, true);
if (rc.IsFailure()) return rc; if (rc.IsFailure()) return rc;
foreach (string file in Directory.EnumerateFiles(fullPath)) rc = GetDirInfo(out DirectoryInfo dir, fullPath);
{ if (rc.IsFailure()) return rc;
rc = TargetLockedAvoidance.RetryToAvoidTargetLocked(
() =>
{
rc = GetFileInfo(out FileInfo fileInfo, file);
if (rc.IsFailure()) return rc;
return DeleteFileInternal(fileInfo); return CleanDirectoryInternal(dir, _fsClient);
}, _fsClient);
if (rc.IsFailure()) return rc;
}
foreach (string dir in Directory.EnumerateDirectories(fullPath))
{
rc = TargetLockedAvoidance.RetryToAvoidTargetLocked(
() =>
{
rc = GetDirInfo(out DirectoryInfo dirInfo, dir);
if (rc.IsFailure()) return rc;
return DeleteDirectoryInternal(dirInfo, true);
}, _fsClient);
if (rc.IsFailure()) return rc;
}
return Result.Success;
} }
protected override Result DoDeleteFile(U8Span path) protected override Result DoDeleteFile(U8Span path)
@ -623,6 +598,32 @@ namespace LibHac.FsSystem
return Result.Success; return Result.Success;
} }
private static Result CleanDirectoryInternal(DirectoryInfo dir, FileSystemClient fsClient)
{
try
{
foreach (FileInfo fileInfo in dir.EnumerateFiles())
{
Result rc = TargetLockedAvoidance.RetryToAvoidTargetLocked(() => DeleteFileInternal(fileInfo),
fsClient);
if (rc.IsFailure()) return rc;
}
foreach (DirectoryInfo dirInfo in dir.EnumerateDirectories())
{
Result rc = TargetLockedAvoidance.RetryToAvoidTargetLocked(() => DeleteDirectoryInternal(dirInfo, true),
fsClient);
if (rc.IsFailure()) return rc;
}
}
catch (Exception ex) when (ex.HResult < 0)
{
return HResult.HResultToHorizonResult(ex.HResult).Log();
}
return Result.Success;
}
private static Result DeleteDirectoryInternal(DirectoryInfo dir, bool recursive) private static Result DeleteDirectoryInternal(DirectoryInfo dir, bool recursive)
{ {
if (!dir.Exists) if (!dir.Exists)