Я понял, как читать большой файл в файл меньшего размера, но только если я начну с самого начала. Я хотел бы уметь читать от середины до произвольного места. Я понимаю, что это звучит безумно, но у меня есть свои причины. Я продолжаю ничего не записывать в файл, когда по какой-то причине устанавливаю позицию больше 0. В итоге я получу файл, полный нулевых значений.
Я думал, что это будет читать 300 КБ из 2,5 МБ в файл.
public static FileStream stream = new FileStream(@"file.dat", FileMode.Open, FileAccess.Read);
public static FileStream shortFile = null;
int limit = 300000;
public MainWindow()
{
byte[] block = new byte[limit];
using (FileStream fs = File.Create("tempfile.dat"))
{
var newposition = stream.Seek(2500000, SeekOrigin.Begin);
stream.Position = newposition;
while (stream.Read(block, 0, limit) > 0 && stream.Position <= limit)
{
fs.Write(block, 0, block.Length);
}
}
InitializeComponent();
}
Да, я имел в виду именно это.
Проблема в вашем while
(и вам не нужно устанавливать .Position
после вызова .Seek
), взгляните на эту часть: && stream.Position <= limit
, так как вы перемещаете позицию на 2500000 байт, stream.Position > limit
и цикл while не выполняется.
Вы сказали «Я думал, что это приведет к чтению 300 КБ из 2,5 МБ в файл»; но у вас есть limit
, а у Seek все наоборот. Позиция поиска должна быть установлена на 300000; limit
должен быть 2500000.
Другие советы:
using
(т.е. сделайте это для stream
).stream.Position = newposition;
, так как это только что сделал Seek.
"I worked out how to read a large file into a smaller file"
. Вы имели в виду написать?