<div dir="ltr"><div style>Hi</div><div><br></div><div>We've had a problems with FileStream under Mono (different versions, both 2.10.x and 3.0.x). It seems like some internal positioning problem, because instead of overwriting some parts of file, it just appends written data. It is very critical that the amount of bytes written is larger than internal buffer size. I've managed to create small isolated test case that shows both what is necessary for bug to occur and easy workaround for that. But hopefully this will be fixed as this is core functionality.</div>

<div><br></div><div style>I've filed a bug report here: <a href="https://bugzilla.xamarin.com/show_bug.cgi?id=11699">https://bugzilla.xamarin.com/show_bug.cgi?id=11699</a></div><div><br></div><div>    using System;</div>

<div>    using System.IO;</div><div>    using NUnit.Framework;</div><div><br></div><div>    [TestFixture]</div><div>    public class mono_filestream_bug</div><div>    {</div><div>        [Test]</div><div>        public void show_time()</div>

<div>        {</div><div>            const int pos = 1;</div><div>            const int bufferSize = 128;</div><div><br></div><div>            var filename = Path.GetTempFileName();</div><div>            File.WriteAllBytes(filename, new byte[pos + 1]); // init file with zeros</div>

<div><br></div><div>            var bytes = new byte[bufferSize + 1 /* THIS IS WHAT MAKES A BIG DIFFERENCE */];</div><div>            new Random().NextBytes(bytes);</div><div><br></div><div>            using (var file = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.Read,</div>

<div>                                             bufferSize, FileOptions.SequentialScan))</div><div>            {</div><div>                file.Read(new byte[pos], 0, pos); // THIS READ IS CRITICAL, WITHOUT IT EVERYTHING WORKS</div>

<div>                Assert.AreEqual(pos, file.Position); // !!! here it says position is correct, but writes at different position !!!</div><div>                // file.Position = pos; // !!! this fixes test !!!</div><div>

                file.Write(bytes, 0, bytes.Length);</div><div><br></div><div>                //Assert.AreEqual(pos + bytes.Length, file.Length); -- fails</div><div>            }</div><div><br></div><div>            using (var filestream = File.Open(filename, FileMode.Open, FileAccess.Read))</div>

<div>            {</div><div>                var bb = new byte[bytes.Length];</div><div>                filestream.Position = pos;</div><div>                filestream.Read(bb, 0, bb.Length);</div><div>                Assert.AreEqual(bytes, bb);</div>

<div>            }</div><div>        }</div><div>    }</div><div><br></div><div><div dir="ltr"><div><br></div>Best regards,<div>Andrii Nakryiko</div></div></div>
</div>