.NET Core中向已存在文件的特定位置写入数据
本例使用.NET Core向一个文本文件中的特定位置写入数据,来模拟文件上传中的断点续传是如何在服务器端实现的。
新建一个.NET Core控制台项目FileContinueToWrite,其Program.cs的源代码如下:
using System; using System.Text; using System.IO; namespace FileContinueToWrite { class Program { /// <summary> /// GenerateFile方法用于生成文本文件Demo.txt,写入初始字符串"123456789" /// </summary> static void GenerateFile() { var filePath = AppDomain.CurrentDomain.BaseDirectory + @"File\Demo.txt"; //如果文本文件Demo.txt已经存在,则将其删除 if (File.Exists(filePath)) { File.Delete(filePath); } //创建文本文件Demo.txt,并写入初始字符串"123456789" using (var fileStream = new FileStream(filePath, FileMode.CreateNew)) { string content = "123456789";//向文本文件Demo.txt中写入的内容为"123456789" byte[] data = Encoding.ASCII.GetBytes(content);//使用ASCII码将字符串转换为字节数据,所以一个字符占用一个字节 fileStream.Write(data, 0, data.Length); } } /// <summary> /// AppendCharsAfter5方法打开文本文件Demo.txt,从文件流第5个字节后开始写入字符串"ABC" /// </summary> static void AppendCharsAfter5() { var filePath = AppDomain.CurrentDomain.BaseDirectory + @"File\Demo.txt"; //由于我们是在已经存在的文本文件Demo.txt中写入数据,并且要从文件流第5个字节后开始写入,所以下面要设置FileStream为FileMode.Open和FileAccess.ReadWrite,这样才能从文本文件Demo.txt中第5个字节后开始写入数据 using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite)) { string content = "ABC";//向文本文件Demo.txt中写入的内容为"ABC" byte[] data = Encoding.ASCII.GetBytes(content);//使用ASCII码将字符串转换为字节数据,所以一个字符占用一个字节 fileStream.Position = 5;//设置FileStream的Position为5,从文本文件Demo.txt中第5个字节后开始写入新的字符串"ABC"。由于执行完GenerateFile方法后,文本文件Demo.txt的内容为"123456789",所以第5个字节也就是"5"这个字符,所以将"ABC"写入第5个字节后,相当于是在"12345"后写入"ABC",原本的"678"会被覆盖为"ABC" fileStream.Write(data, 0, data.Length);//所以这里写入字符串"ABC"到文本文件Demo.txt后,Demo.txt的内容为"12345ABC9" } } static void Main(string[] args) { GenerateFile(); Console.WriteLine("Press any key to run AppendCharsAfter5()..."); Console.ReadKey(); AppendCharsAfter5(); Console.WriteLine("Press any key to end..."); Console.ReadKey(); } } }
上面的代码会先运行GenerateFile方法生成一个文本文件Demo.txt,并写入初始字符串"123456789",然后运行AppendCharsAfter5方法,向文本文件Demo.txt中的第5个字节后写入字符串"ABC"。
GenerateFile方法运行后,文本文件Demo.txt的内容如下:
AppendCharsAfter5方法运行后,文本文件Demo.txt的内容如下: