diff --git a/src/MarkdownSnippets/FileEx.cs b/src/MarkdownSnippets/FileEx.cs index 5c821849..82b91aab 100644 --- a/src/MarkdownSnippets/FileEx.cs +++ b/src/MarkdownSnippets/FileEx.cs @@ -48,15 +48,16 @@ public static void ClearReadOnly(string path) return; } - new FileInfo(path) + var attributes = File.GetAttributes(path); + if ((attributes & FileAttributes.ReadOnly) != 0) { - IsReadOnly = false - }; + File.SetAttributes(path, attributes & ~FileAttributes.ReadOnly); + } } - public static void MakeReadOnly(string path) => - new FileInfo(path) - { - IsReadOnly = true - }; + public static void MakeReadOnly(string path) + { + var attributes = File.GetAttributes(path); + File.SetAttributes(path, attributes | FileAttributes.ReadOnly); + } } \ No newline at end of file diff --git a/src/Tests/FileExTests.cs b/src/Tests/FileExTests.cs index 93644bd9..5a59a2fe 100644 --- a/src/Tests/FileExTests.cs +++ b/src/Tests/FileExTests.cs @@ -1,5 +1,72 @@ public class FileExTests { + [Fact] + public void MakeReadOnly_SetsReadOnlyAttribute() + { + var tempFile = Path.GetTempFileName(); + try + { + FileEx.MakeReadOnly(tempFile); + + var attributes = File.GetAttributes(tempFile); + Assert.True((attributes & FileAttributes.ReadOnly) != 0); + } + finally + { + File.SetAttributes(tempFile, FileAttributes.Normal); + File.Delete(tempFile); + } + } + + [Fact] + public void ClearReadOnly_RemovesReadOnlyAttribute() + { + var tempFile = Path.GetTempFileName(); + try + { + File.SetAttributes(tempFile, File.GetAttributes(tempFile) | FileAttributes.ReadOnly); + + FileEx.ClearReadOnly(tempFile); + + var attributes = File.GetAttributes(tempFile); + Assert.False((attributes & FileAttributes.ReadOnly) != 0); + } + finally + { + File.SetAttributes(tempFile, FileAttributes.Normal); + File.Delete(tempFile); + } + } + + [Fact] + public void ClearReadOnly_DoesNothingIfFileDoesNotExist() + { + var nonExistentFile = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); + + FileEx.ClearReadOnly(nonExistentFile); + + Assert.False(File.Exists(nonExistentFile)); + } + + [Fact] + public void MakeReadOnly_ThenClearReadOnly_RoundTrip() + { + var tempFile = Path.GetTempFileName(); + try + { + FileEx.MakeReadOnly(tempFile); + Assert.True((File.GetAttributes(tempFile) & FileAttributes.ReadOnly) != 0); + + FileEx.ClearReadOnly(tempFile); + Assert.False((File.GetAttributes(tempFile) & FileAttributes.ReadOnly) != 0); + } + finally + { + File.SetAttributes(tempFile, FileAttributes.Normal); + File.Delete(tempFile); + } + } + [Fact] public void FixFileCapitalization_ReturnsActualCasing() {