Как запаковать большой файл в .tar?
Существует ли вообще реализация записи в .tar большого файла, в которой можно было бы указать свой буфер? Это нужно среди прочего чтобы контролировать прогресс запаковки.
Код для примера:
byte[] buffer = ArrayPool<byte>.Shared.Rent(1024 * 1024);
string item = @"R:\Bigfile.dat";
using (FileStream _writestream = File.Create(@"R:\test.tar")
using (TarWriter tarwriter = new(_writestream, TarEntryFormat.Pax, leaveOpen: false))
using (FileStream srcFile = new(item, FileMode.Open, FileAccess.Read))
{
string fileName = item.Remove(0, mainDir.Length + 1).Replace('\\', '/');
PaxTarEntry te = new(TarEntryType.RegularFile, fileName)
{
DataStream = new MemoryStream()
};
int currentBlockSize = 0;
while ((currentBlockSize = srcFile.Read(buffer)) > 0)
{
te.DataStream.Write(buffer.AsSpan(0, currentBlockSize));
}
te.DataStream.Position = 0;
tarwriter.WriteEntry(te);
}
ArrayPool<byte>.Shared.Return(buffer);
Если его использовать - будет большое использование оперативной памяти. Да, вероятно потому что запись будет вестись в MemoryStream(). Но какие есть более правильные варианты, если нужно записать ОЧЕНЬ большой файл? Чтобы запись сразу велась в .tar-файл, а не в оперативку, и я мог контролировать объём каждой итерации цикла записи через размер буфера.