C# Stream.Seek – 在流中定位

  • Post category:C#

Stream.Seek 方法是C#中用于设置当前流内部的位置指针的方法。在C#中,Stream是一个抽象类,代表字节流的基类。所有字节流的实现都继承自Stream类。Stream.Seek 方法可以用于设置流的读写起始位置,使得接下来的读写操作起始于设置的位置。

Stream.Seek 方法的使用方法非常简单。它接受两个参数,第一个参数表示需要偏移的字节数,第二个参数是基准点(SeekOrigin),它代表着偏移量的起始点。基准点为一个 SeekOrigin 枚举值,包括Begin、Current、End。分别表示文件的开头,当前位置,文件的结尾。

以下是Stream.Seek 方法的完整签名:

public virtual long Seek(long offset, SeekOrigin origin);

偏移量 offset 可以为正数或负数。当基准点为Begin时,偏移量表示在文件开头偏移多少个字节;当基准点为Current时,偏移量表示相对于当前读写位置的偏移量;当基准点为End时,偏移量表示相对于文件结尾的偏移量。

以下是设置当前读写位置的示例:

using System;
using System.IO;

class Program
{
    public static void Main()
    {
        string path = @"sample.txt";

        using (FileStream fs = new FileStream(path, FileMode.Open))
        {
            fs.Seek(5, SeekOrigin.Begin);

            byte[] buffer = new byte[1024];
            fs.Read(buffer, 0, buffer.Length);

            Console.WriteLine(System.Text.Encoding.Default.GetString(buffer));
        }

        Console.ReadKey();
    }
}

上述示例中,我们首先获得一个文件流,将读写位置设置到文件开头的第5个字节处,然后使用Read方法读取一定量的字节数据。

以下是设置当前写位置的示例:

using System;
using System.IO;

class Program
{
    public static void Main()
    {
        string path = @"sample.txt";

        using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
        {
            fs.Seek(0, SeekOrigin.End);

            byte[] buffer = System.Text.Encoding.UTF8.GetBytes("Hello World");

            fs.Write(buffer, 0, buffer.Length);
        }

        Console.WriteLine("Write data done!");

        Console.ReadKey();
    }
}

上述示例中,我们打开一个文件流并将写位置设置到文件结尾,然后用Write方法写入一些数据。

需要特别注意的是,当设置读写位置时,如果设置位置超出了流的边界,则会抛出System.IO.IOException异常。因此,在使用 Stream.Seek 方法时应格外小心。