C# 使用偏移量写入和读取流,以减少光盘寻道

C# 使用偏移量写入和读取流,以减少光盘寻道,c#,file,io,stream,C#,File,Io,Stream,我正在读取一个文件并将其流写入一个文件,我要做的是在一个文件中写入多个文件并按偏移量读取它们 在编写文件时,我理解需要知道文件偏移量和流的长度才能读回文件 var file = @"d:\foo.pdf"; var stream = File.ReadAllBytes(file); // here i have the length of the Console.WriteLine(stream.LongLength); using (var br = new BinaryWriter(F

我正在读取一个文件并将其流写入一个文件,我要做的是在一个文件中写入多个文件并按偏移量读取它们

在编写文件时,我理解需要知道文件偏移量和流的长度才能读回文件

var file = @"d:\foo.pdf";

var stream = File.ReadAllBytes(file);
// here i have the length of the 
Console.WriteLine(stream.LongLength);

using (var br = new BinaryWriter(File.Open(@"d:\foo.bin", FileMode.OpenOrCreate)))
{
     br.Write(stream);
}
我需要在写入多个文件时找到偏移量

此外,在读取文件时,如何从偏移量开始并按长度向前读取


最后,此方法是否减少了光盘搜索的次数?

要读回各种片段,您需要存储各个文件的长度。例如:

using(var dest = File.Open(@"d:\foo.bin", FileMode.OpenOrCreate))
{
    Append(dest, file);
    Append(dest, anotherFile);
}
...
static void AppendFile(Stream dest, string path)
{
    using(var source = File.OpenRead(path))
    {
        var lenHeader = BitConverter.GetBytes(source.Length);
        dest.Write(lenHeader, 0, 4);
        source.CopyTo(dest);
    }
}
然后,要回过头来阅读,您可以执行以下操作:

using(var source = File.OpenRead(...))
{
    int len = ReadLength(source);
    stream.Seek(len, SeekOrigin.Current); // skip the first file
    len = ReadLength(source);
    // TODO: now read len-many bytes from the second file        
}
static int ReadLength(Stream stream)
{
    byte[] buffer = new byte[4];
    int count = 4, offset = 0, read;
    while(count != 0 && (read = stream.Read(buffer, offset, count)) > 0)
    {
        count -= read;
        offset += read;
    }
    if (count != 0) throw new EndOfStreamException();
    return BitConverter.ToInt32(buffer, 0);
}
至于读取len,需要很多字节;您可以只跟踪它并在读取时减小它,也可以创建一个长度受限的
包装器。两种方法都有效