From ead9d86633dab55a66e5c93586e46d5315b2ce2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Gr=C3=BCnwald?= Date: Tue, 21 Feb 2023 05:43:24 +0100 Subject: [PATCH] Use Cake's IFileSystem for read/write operations instead of System.IO.File (#118) * Use Cake's IFileSystem for read/write operations instead of System.IO.File In all file aliases, use Cake's IFileSystem abstraction instead of using System.IO.File. This enables testing of tasks that use the file aliases by mocking IFileSystem. The FileTouch() alias continues to use System.IO.File since there is no API in IFileSystem that allows setting the last write time. * Remove unnecessary nullable annotation Co-authored-by: C. Augusto Proiete * Convert paths to absolute paths before opening file stream Co-authored-by: C. Augusto Proiete --------- Co-authored-by: C. Augusto Proiete --- src/Cake.FileHelpers/FileHelpers.cs | 97 ++++++++++++++++++----------- 1 file changed, 61 insertions(+), 36 deletions(-) diff --git a/src/Cake.FileHelpers/FileHelpers.cs b/src/Cake.FileHelpers/FileHelpers.cs index 586c09a..b557fb4 100644 --- a/src/Cake.FileHelpers/FileHelpers.cs +++ b/src/Cake.FileHelpers/FileHelpers.cs @@ -27,9 +27,8 @@ public static class FileHelperAliases [CakeMethodAlias] public static string FileReadText (this ICakeContext context, FilePath file) { - var filename = file.MakeAbsolute (context.Environment).FullPath; - - return File.ReadAllText (filename); + using var streamReader = CreateStreamReader(context, file); + return streamReader.ReadToEnd(); } /// @@ -42,9 +41,8 @@ public static string FileReadText (this ICakeContext context, FilePath file) [CakeMethodAlias] public static string FileReadText(this ICakeContext context, FilePath file, Encoding encoding) { - var filename = file.MakeAbsolute(context.Environment).FullPath; - - return File.ReadAllText(filename, encoding); + using var streamReader = CreateStreamReader(context, file, encoding); + return streamReader.ReadToEnd(); } /// @@ -56,9 +54,8 @@ public static string FileReadText(this ICakeContext context, FilePath file, Enco [CakeMethodAlias] public static string[] FileReadLines (this ICakeContext context, FilePath file) { - var filename = file.MakeAbsolute (context.Environment).FullPath; - - return File.ReadAllLines (filename); + using var streamReader = CreateStreamReader(context, file); + return ReadLines(streamReader); } /// @@ -71,9 +68,8 @@ public static string[] FileReadLines (this ICakeContext context, FilePath file) [CakeMethodAlias] public static string[] FileReadLines(this ICakeContext context, FilePath file, Encoding encoding) { - var filename = file.MakeAbsolute(context.Environment).FullPath; - - return File.ReadAllLines(filename, encoding); + using var streamReader = CreateStreamReader(context, file, encoding); + return ReadLines(streamReader); } /// @@ -85,9 +81,8 @@ public static string[] FileReadLines(this ICakeContext context, FilePath file, E [CakeMethodAlias] public static void FileWriteText (this ICakeContext context, FilePath file, string text) { - var filename = file.MakeAbsolute (context.Environment).FullPath; - - File.WriteAllText (filename, text); + using var streamWriter = CreateStreamWriter(context, file, FileMode.Create); + streamWriter.Write(text); } /// @@ -100,9 +95,8 @@ public static void FileWriteText (this ICakeContext context, FilePath file, stri [CakeMethodAlias] public static void FileWriteText(this ICakeContext context, FilePath file, Encoding encoding, string text) { - var filename = file.MakeAbsolute(context.Environment).FullPath; - - File.WriteAllText(filename, text, encoding); + using var streamWriter = CreateStreamWriter(context, file, FileMode.Create, encoding); + streamWriter.Write(text); } /// @@ -114,9 +108,8 @@ public static void FileWriteText(this ICakeContext context, FilePath file, Encod [CakeMethodAlias] public static void FileWriteLines (this ICakeContext context, FilePath file, string[] lines) { - var filename = file.MakeAbsolute (context.Environment).FullPath; - - File.WriteAllLines (filename, lines); + using var streamWriter = CreateStreamWriter(context, file, FileMode.Create); + WriteLines(streamWriter, lines); } /// @@ -129,9 +122,8 @@ public static void FileWriteLines (this ICakeContext context, FilePath file, str [CakeMethodAlias] public static void FileWriteLines(this ICakeContext context, FilePath file, Encoding encoding, string[] lines) { - var filename = file.MakeAbsolute(context.Environment).FullPath; - - File.WriteAllLines(filename, lines, encoding); + using var streamWriter = CreateStreamWriter(context, file, FileMode.Create, encoding); + WriteLines(streamWriter, lines); } /// @@ -143,9 +135,8 @@ public static void FileWriteLines(this ICakeContext context, FilePath file, Enco [CakeMethodAlias] public static void FileAppendText (this ICakeContext context, FilePath file, string text) { - var filename = file.MakeAbsolute (context.Environment).FullPath; - - File.AppendAllText (filename, text); + using var streamWriter = CreateStreamWriter(context, file, FileMode.OpenOrCreate); + streamWriter.Write(text); } /// @@ -158,9 +149,8 @@ public static void FileAppendText (this ICakeContext context, FilePath file, str [CakeMethodAlias] public static void FileAppendText(this ICakeContext context, FilePath file, Encoding encoding, string text) { - var filename = file.MakeAbsolute(context.Environment).FullPath; - - File.AppendAllText(filename, text, encoding); + using var streamWriter = CreateStreamWriter(context, file, FileMode.OpenOrCreate, encoding); + streamWriter.Write(text); } /// @@ -172,9 +162,8 @@ public static void FileAppendText(this ICakeContext context, FilePath file, Enco [CakeMethodAlias] public static void FileAppendLines (this ICakeContext context, FilePath file, string[] lines) { - var filename = file.MakeAbsolute (context.Environment).FullPath; - - File.AppendAllLines (filename, lines); + using var streamWriter = CreateStreamWriter(context, file, FileMode.OpenOrCreate); + WriteLines(streamWriter, lines); } /// @@ -187,9 +176,8 @@ public static void FileAppendLines (this ICakeContext context, FilePath file, st [CakeMethodAlias] public static void FileAppendLines(this ICakeContext context, FilePath file, Encoding encoding, string[] lines) { - var filename = file.MakeAbsolute(context.Environment).FullPath; - - File.AppendAllLines(filename, lines, encoding); + using var streamWriter = CreateStreamWriter(context, file, FileMode.OpenOrCreate, encoding); + WriteLines(streamWriter, lines); } /// @@ -741,6 +729,43 @@ public static Group FindRegexMatchGroupInFile(this ICakeContext context, FilePat return null; } + + private static StreamReader CreateStreamReader(ICakeContext context, FilePath file, Encoding encoding = null) + { + var stream = context.FileSystem.GetFile(file.MakeAbsolute(context.Environment)).OpenRead(); + return encoding is null + ? new StreamReader(stream, leaveOpen: false) + : new StreamReader(stream, encoding, leaveOpen: false); + } + + private static StreamWriter CreateStreamWriter(ICakeContext context, FilePath file, FileMode mode, Encoding encoding = null) + { + var stream = context.FileSystem.GetFile(file.MakeAbsolute(context.Environment)).Open(mode); + return encoding is null + ? new StreamWriter(stream, leaveOpen: false) + : new StreamWriter(stream, encoding, leaveOpen: false); + } + + private static string[] ReadLines(StreamReader streamReader) + { + var lines = new List(); + + string line; + while ((line = streamReader.ReadLine()) is not null) + { + lines.Add(line); + } + + return lines.ToArray(); + } + + private static void WriteLines(StreamWriter streamWriter, string[] lines) + { + foreach (var line in lines) + { + streamWriter.WriteLine(line); + } + } } }