Лучше передавать данные из одного файла в другой, загружая только небольшие части в память:
public static void CopyFileSection(string inFile, string outFile, long startPosition, long size)
{
// Open the files as streams
using (var inStream = File.OpenRead(inFile))
using (var outStream = File.OpenWrite(outFile))
{
// seek to the start position
inStream.Seek(startPosition, SeekOrigin.Begin);
// Create a variable to track how much more to copy
// and a buffer to temporarily store a section of the file
long remaining = size;
byte[] buffer = new byte[81920];
do
{
// Read the smaller of 81920 or remaining and break out of the loop if we've already reached the end of the file
int bytesRead = inStream.Read(buffer, 0, (int)Math.Min(buffer.Length, remaining));
if (bytesRead == 0) { break; }
// Write the buffered bytes to the output file
outStream.Write(buffer, 0, bytesRead);
remaining -= bytesRead;
}
while (remaining > 0);
}
}
Использование:
CopyFileSection(sourcefile, outfile, offset, size);
Это должно иметь эквивалент функциональность вашего текущего метода без накладных расходов на чтение всего файла, независимо от его размера, в память.
Примечание. Если вы делаете это в коде, который использует async / await, вам следует изменить CopyFileSection
на public static async Task CopyFileSection
и замените inStream.Read
и outStream.Write
на await inStream.ReadAsync
и await outStream.WriteAsync
соответственно.