diff options
author | Jesse Plamondon-Willard <github@jplamondonw.com> | 2018-06-08 18:46:58 -0400 |
---|---|---|
committer | Jesse Plamondon-Willard <github@jplamondonw.com> | 2018-06-08 18:46:58 -0400 |
commit | 86a3f8dd460f329fad903770231016813e750168 (patch) | |
tree | 6db8cd9c2be1c507c8c79af02889d64ba08458ff /src/StardewModdingAPI.Toolkit/Utilities/FileUtilities.cs | |
parent | 18906de0f4a31b70f21f386f65bd3fda3ec9fb13 (diff) | |
download | SMAPI-86a3f8dd460f329fad903770231016813e750168.tar.gz SMAPI-86a3f8dd460f329fad903770231016813e750168.tar.bz2 SMAPI-86a3f8dd460f329fad903770231016813e750168.zip |
allow launching multiple instances without manually changing log path (#494)
Diffstat (limited to 'src/StardewModdingAPI.Toolkit/Utilities/FileUtilities.cs')
-rw-r--r-- | src/StardewModdingAPI.Toolkit/Utilities/FileUtilities.cs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/StardewModdingAPI.Toolkit/Utilities/FileUtilities.cs b/src/StardewModdingAPI.Toolkit/Utilities/FileUtilities.cs new file mode 100644 index 00000000..7856fdb1 --- /dev/null +++ b/src/StardewModdingAPI.Toolkit/Utilities/FileUtilities.cs @@ -0,0 +1,46 @@ +using System.IO; +using System.Threading; + +namespace StardewModdingAPI.Toolkit.Utilities +{ + /// <summary>Provides utilities for dealing with files.</summary> + public static class FileUtilities + { + /********* + ** Public methods + *********/ + /// <summary>Delete a file or folder regardless of file permissions, and block until deletion completes.</summary> + /// <param name="entry">The file or folder to reset.</param> + public static void ForceDelete(FileSystemInfo entry) + { + // ignore if already deleted + entry.Refresh(); + if (!entry.Exists) + return; + + // delete children + if (entry is DirectoryInfo folder) + { + foreach (FileSystemInfo child in folder.GetFileSystemInfos()) + FileUtilities.ForceDelete(child); + } + + // reset permissions & delete + entry.Attributes = FileAttributes.Normal; + entry.Delete(); + + // wait for deletion to finish + for (int i = 0; i < 10; i++) + { + entry.Refresh(); + if (entry.Exists) + Thread.Sleep(500); + } + + // throw exception if deletion didn't happen before timeout + entry.Refresh(); + if (entry.Exists) + throw new IOException($"Timed out trying to delete {entry.FullName}"); + } + } +} |