From c49b157f480113f6bb8bda32cd62a99b579d2df7 Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Sun, 11 Oct 2026 12:20:35 +0200 Subject: [PATCH 1/3] Retarget ByteArrayToFile to net10.0 and let CI run its tests Both projects move from net6.0 to net10.0. Microsoft.NET.Test.Sdk 18.10.1, MSTest.TestAdapter and MSTest.TestFramework 4.5.1, coverlet.collector 10.1.0. The test class was named LiveByteArrayToFileUnitTest, and the CI filter FullyQualifiedName!~Live excluded every test in the folder. It is renamed to ByteArrayToFileUnitTest. Each test now writes to its own temporary file and deletes it afterwards. Adds a regression test that writes a 38-byte array and then a 10-byte array through SaveByteArrayToFileWithBinaryWriter and expects a 10-byte file. It fails here, because File.OpenWrite does not truncate an existing file. --- .../ByteArrayToFile/ByteArrayToFile.csproj | 2 +- .../ByteArrayToFileTest.csproj | 10 ++-- .../ByteArrayToFileUnitTest.cs | 55 +++++++++++++++++++ .../LiveByteArrayToFileUnitTest.cs | 41 -------------- 4 files changed, 61 insertions(+), 47 deletions(-) create mode 100644 files-csharp/ByteArrayToFile/ByteArrayToFileTest/ByteArrayToFileUnitTest.cs delete mode 100644 files-csharp/ByteArrayToFile/ByteArrayToFileTest/LiveByteArrayToFileUnitTest.cs diff --git a/files-csharp/ByteArrayToFile/ByteArrayToFile/ByteArrayToFile.csproj b/files-csharp/ByteArrayToFile/ByteArrayToFile/ByteArrayToFile.csproj index 16e62dd96d..47081a6d34 100644 --- a/files-csharp/ByteArrayToFile/ByteArrayToFile/ByteArrayToFile.csproj +++ b/files-csharp/ByteArrayToFile/ByteArrayToFile/ByteArrayToFile.csproj @@ -2,7 +2,7 @@ Library - net6.0 + net10.0 enable enable diff --git a/files-csharp/ByteArrayToFile/ByteArrayToFileTest/ByteArrayToFileTest.csproj b/files-csharp/ByteArrayToFile/ByteArrayToFileTest/ByteArrayToFileTest.csproj index 2a19789656..cb955cbaf9 100644 --- a/files-csharp/ByteArrayToFile/ByteArrayToFileTest/ByteArrayToFileTest.csproj +++ b/files-csharp/ByteArrayToFile/ByteArrayToFileTest/ByteArrayToFileTest.csproj @@ -1,17 +1,17 @@ - net6.0 + net10.0 enable false - - - - + + + + diff --git a/files-csharp/ByteArrayToFile/ByteArrayToFileTest/ByteArrayToFileUnitTest.cs b/files-csharp/ByteArrayToFile/ByteArrayToFileTest/ByteArrayToFileUnitTest.cs new file mode 100644 index 0000000000..5f2dc422a3 --- /dev/null +++ b/files-csharp/ByteArrayToFile/ByteArrayToFileTest/ByteArrayToFileUnitTest.cs @@ -0,0 +1,55 @@ +using ByteArrayToFile; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.IO; +using System.Text; + +namespace ByteArrayToFileTest +{ + [TestClass] + public class ByteArrayToFileUnitTest + { + const string Data = "Byte Array To File Test"; + readonly byte[] _dataInBytes = Encoding.UTF8.GetBytes(Data); + readonly string _filePath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + + [TestCleanup] + public void DeleteFile() => File.Delete(_filePath); + + [TestMethod] + public void GivenBinaryWriter_WhenSavingByteArray_ThenLoadCorrectData() + { + ByteArrayToFileConverter.SaveByteArrayToFileWithBinaryWriter(_dataInBytes, _filePath); + + Assert.AreEqual(Data, File.ReadAllText(_filePath)); + } + + [TestMethod] + public void GivenBinaryWriter_WhenSavingShorterArrayOverLongerFile_ThenFileIsTruncated() + { + var longer = Encoding.UTF8.GetBytes("This is a test of the OpenWrite method"); + var shorter = Encoding.UTF8.GetBytes("Second run"); + + ByteArrayToFileConverter.SaveByteArrayToFileWithBinaryWriter(longer, _filePath); + ByteArrayToFileConverter.SaveByteArrayToFileWithBinaryWriter(shorter, _filePath); + + Assert.AreEqual(shorter.Length, new FileInfo(_filePath).Length); + Assert.AreEqual("Second run", File.ReadAllText(_filePath)); + } + + [TestMethod] + public void GivenFileStream_WhenSavingByteArray_ThenLoadCorrectData() + { + ByteArrayToFileConverter.SaveByteArrayToFileWithFileStream(_dataInBytes, _filePath); + + Assert.AreEqual(Data, File.ReadAllText(_filePath)); + } + + [TestMethod] + public void GivenStaticFileMethod_WhenSavingByteArray_ThenLoadCorrectData() + { + ByteArrayToFileConverter.SaveByteArrayToFileWithStaticMethod(_dataInBytes, _filePath); + + Assert.AreEqual(Data, File.ReadAllText(_filePath)); + } + } +} diff --git a/files-csharp/ByteArrayToFile/ByteArrayToFileTest/LiveByteArrayToFileUnitTest.cs b/files-csharp/ByteArrayToFile/ByteArrayToFileTest/LiveByteArrayToFileUnitTest.cs deleted file mode 100644 index e368821dc4..0000000000 --- a/files-csharp/ByteArrayToFile/ByteArrayToFileTest/LiveByteArrayToFileUnitTest.cs +++ /dev/null @@ -1,41 +0,0 @@ -using ByteArrayToFile; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.IO; -using System.Text; - -namespace ByteArrayToFileTest -{ - [TestClass] - public class LiveByteArrayToFileUnitTest - { - const string Data = "Byte Array To File Test"; - readonly byte[] _dataInBytes = Encoding.UTF8.GetBytes(Data); - - [TestMethod] - public void GivenBinaryWriter_WhenSavingByteArray_ThenLoadCorrectData() - { - string filePath = "./binary-writer-file.txt"; - ByteArrayToFileConverter.SaveByteArrayToFileWithBinaryWriter(_dataInBytes, filePath); - - Assert.AreEqual(Data, File.ReadAllText(filePath)); - } - - [TestMethod] - public void GivenFileStream_WhenSavingByteArray_ThenLoadCorrectData() - { - string filePath = "./filestream-file.txt"; - ByteArrayToFileConverter.SaveByteArrayToFileWithFileStream(_dataInBytes, filePath); - - Assert.AreEqual(Data, File.ReadAllText(filePath)); - } - - [TestMethod] - public void GivenStaticFileMethod_WhenSavingByteArray_ThenLoadCorrectData() - { - string filePath = "./static-method-file.txt"; - ByteArrayToFileConverter.SaveByteArrayToFileWithStaticMethod(_dataInBytes, filePath); - - Assert.AreEqual(Data, File.ReadAllText(filePath)); - } - } -} \ No newline at end of file From 873a6ef3d0f5ddfc8bf9bea7c456c637f089743f Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Sun, 11 Oct 2026 12:20:48 +0200 Subject: [PATCH 2/3] Open the BinaryWriter's file with File.Create so it is truncated File.OpenWrite opens with FileMode.OpenOrCreate, which keeps the old length: writing a shorter array over a longer file left the old tail behind. File.Create truncates an existing file. The regression test now passes. --- .../ByteArrayToFile/ByteArrayToFile/ByteArrayToFileConverter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files-csharp/ByteArrayToFile/ByteArrayToFile/ByteArrayToFileConverter.cs b/files-csharp/ByteArrayToFile/ByteArrayToFile/ByteArrayToFileConverter.cs index 0a327a81ad..1a741f9040 100644 --- a/files-csharp/ByteArrayToFile/ByteArrayToFile/ByteArrayToFileConverter.cs +++ b/files-csharp/ByteArrayToFile/ByteArrayToFile/ByteArrayToFileConverter.cs @@ -4,7 +4,7 @@ public static class ByteArrayToFileConverter { public static void SaveByteArrayToFileWithBinaryWriter(byte[] data, string filePath) { - using var writer = new BinaryWriter(File.OpenWrite(filePath)); + using var writer = new BinaryWriter(File.Create(filePath)); writer.Write(data); } public static void SaveByteArrayToFileWithFileStream(byte[] data, string filePath) From 3814bc997ecc0a806d66a4b085247b625c2cc38c Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Sun, 11 Oct 2026 12:21:24 +0200 Subject: [PATCH 3/3] Add async, append and offset writes to ByteArrayToFileConverter SaveByteArrayToFileAsync wraps File.WriteAllBytesAsync, AppendByteArrayToFile wraps File.AppendAllBytes (.NET 9), and SaveByteArrayToFileAtOffset opens a handle with File.OpenHandle and writes with RandomAccess.Write. Each has a test. --- .../ByteArrayToFileConverter.cs | 12 ++++++++ .../ByteArrayToFileUnitTest.cs | 28 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/files-csharp/ByteArrayToFile/ByteArrayToFile/ByteArrayToFileConverter.cs b/files-csharp/ByteArrayToFile/ByteArrayToFile/ByteArrayToFileConverter.cs index 1a741f9040..3c66c5b54f 100644 --- a/files-csharp/ByteArrayToFile/ByteArrayToFile/ByteArrayToFileConverter.cs +++ b/files-csharp/ByteArrayToFile/ByteArrayToFile/ByteArrayToFileConverter.cs @@ -15,4 +15,16 @@ public static void SaveByteArrayToFileWithFileStream(byte[] data, string filePat public static void SaveByteArrayToFileWithStaticMethod(byte[] data, string filePath) => File.WriteAllBytes(filePath, data); + + public static Task SaveByteArrayToFileAsync(byte[] data, string filePath, CancellationToken token = default) + => File.WriteAllBytesAsync(filePath, data, token); + + public static void AppendByteArrayToFile(byte[] data, string filePath) + => File.AppendAllBytes(filePath, data); + + public static void SaveByteArrayToFileAtOffset(byte[] data, string filePath, long offset) + { + using var handle = File.OpenHandle(filePath, FileMode.OpenOrCreate, FileAccess.Write); + RandomAccess.Write(handle, data, offset); + } } diff --git a/files-csharp/ByteArrayToFile/ByteArrayToFileTest/ByteArrayToFileUnitTest.cs b/files-csharp/ByteArrayToFile/ByteArrayToFileTest/ByteArrayToFileUnitTest.cs index 5f2dc422a3..6bf333fbcf 100644 --- a/files-csharp/ByteArrayToFile/ByteArrayToFileTest/ByteArrayToFileUnitTest.cs +++ b/files-csharp/ByteArrayToFile/ByteArrayToFileTest/ByteArrayToFileUnitTest.cs @@ -2,6 +2,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using System.IO; using System.Text; +using System.Threading.Tasks; namespace ByteArrayToFileTest { @@ -51,5 +52,32 @@ public void GivenStaticFileMethod_WhenSavingByteArray_ThenLoadCorrectData() Assert.AreEqual(Data, File.ReadAllText(_filePath)); } + + [TestMethod] + public async Task GivenWriteAllBytesAsync_WhenSavingByteArray_ThenLoadCorrectData() + { + await ByteArrayToFileConverter.SaveByteArrayToFileAsync(_dataInBytes, _filePath); + + Assert.AreEqual(Data, File.ReadAllText(_filePath)); + } + + [TestMethod] + public void GivenAppendAllBytes_WhenAppendingByteArray_ThenBytesAreAddedAtTheEnd() + { + ByteArrayToFileConverter.SaveByteArrayToFileWithStaticMethod([1, 2, 3], _filePath); + ByteArrayToFileConverter.AppendByteArrayToFile([4, 5], _filePath); + + CollectionAssert.AreEqual(new byte[] { 1, 2, 3, 4, 5 }, File.ReadAllBytes(_filePath)); + } + + [TestMethod] + public void GivenRandomAccess_WhenWritingAtOffset_ThenBytesAreReplacedInPlace() + { + File.WriteAllText(_filePath, "AAAAAAAAAA"); + + ByteArrayToFileConverter.SaveByteArrayToFileAtOffset(Encoding.UTF8.GetBytes("BB"), _filePath, 4); + + Assert.AreEqual("AAAABBAAAA", File.ReadAllText(_filePath)); + } } }