使用偏移量写入和读取流以减少光盘搜索

时间:2014-02-17 12:49:51

标签: 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(File.Open(@"d:\foo.bin", FileMode.OpenOrCreate)))
{
     br.Write(stream);
}

我需要在写入多个文件时找到偏移量。

同样在回读文件时,如何从偏移量开始并向前阅读只要长度?

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

1 个答案:

答案 0 :(得分:1)

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

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-many字节;你可以只是跟踪它并在阅读时减少它,或者你可以创建一个长度有限的Stream包装器。要么有效。