.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的内容如下:

本文源代码

猜你喜欢

转载自www.cnblogs.com/OpenCoder/p/10275045.html