Как запаковать большой файл в .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-файл, а не в оперативку, и я мог контролировать объём каждой итерации цикла записи через размер буфера.


Ответы (0 шт):