Вам всегда придется переписывать оставшиеся байты из точки вставки. Если эта точка равна 0, то вы перепишете весь файл. Если перед последним байтом осталось 10 байтов, последние 10 байтов будут перезаписаны.
В любом случае нет функции для прямой поддержки «вставить в файл». Но следующий код может сделать это точно.
var sw = new Stopwatch();
var ab = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ";
// create
var fs = new FileStream(@"d:\test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 262144, FileOptions.None);
sw.Restart();
fs.Seek(0, SeekOrigin.Begin);
for (var i = 0; i < 40000000; i++) fs.Write(ASCIIEncoding.ASCII.GetBytes(ab), 0, ab.Length);
sw.Stop();
Console.WriteLine("{0} ms", sw.Elapsed.TotalMilliseconds);
fs.Dispose();
// insert
fs = new FileStream(@"d:\test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 262144, FileOptions.None);
sw.Restart();
byte[] b = new byte[262144];
long target = 10, offset = fs.Length - b.Length;
while (offset != 0)
{
if (offset < 0)
{
offset = b.Length - target;
b = new byte[offset];
}
fs.Position = offset; fs.Read(b, 0, b.Length);
fs.Position = offset + target; fs.Write(b, 0, b.Length);
offset -= b.Length;
}
fs.Position = target; fs.Write(ASCIIEncoding.ASCII.GetBytes(ab), 0, ab.Length);
sw.Stop();
Console.WriteLine("{0} ms", sw.Elapsed.TotalMilliseconds);
Чтобы повысить производительность при вводе-выводе файлов, поиграйте с «волшебными двумя приведенными в действие числами», как в коде выше. Для создания файла используется буфер размером 262144 байта (256 КБ), который не помогает вообще. Тот же самый буфер для вставки выполняет «работу по повышению производительности», как вы можете видеть по результатам StopWatch, если вы запустите код. Предварительный тест на моем ПК дал следующие результаты:
13628,8 мс для создания и 3597,0971 мс для вставки.
Обратите внимание, что целевой байт для вставки равен 10, что означает, что почти весь файл был переписан.