我正在读取文件并将其写入文件,我想要做的是将多个文件写入单个文件并按其偏移量读取它们。
在编写文件时,我知道我需要知道文件偏移量和流的长度以读回文件。
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);
}
我需要在写入多个文件时找到偏移量。
同样在回读文件时,如何从偏移量开始并向前阅读只要长度?
最后,此方法是否会减少光盘搜索次数?
答案 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
包装器。要么有效。