Создание твердого архива с внутренней структурой пути из сгенерированных файлов

Я пытаюсь создать надежный архив из сотен файлов, которые я позже сожму, но все, что я пытаюсь сделать, кажется, сталкивается с проблемой.

Файлы, подлежащие архивированию, создаются в моей программе, и я обращаюсь к ним как Streams. Они должны быть организованы в пути любой длины.

В настоящее время я передаю их в STDIN 7z.exeЯ добиваюсь команды (уведомление -mx0 потому что я не хочу сжиматься на этом шаге)

7z.exe a -t7z "file_out_path" -mx0 -si"internal_archive_path" < stream

используя следующий код

public static void Run(string exe, string args = null, System.IO.Stream stdin = null)
{
    Process p = new Process();
    p.StartInfo.UseShellExecute = false;
    if (stdin != null)
        p.StartInfo.RedirectStandardInput = true;
    p.StartInfo.FileName = exe;
    if (args != null)
        p.StartInfo.Arguments = args;
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    p.Start();
    if (stdin != null)
    {
        // stdin.CopyTo(p.StandardInput.BaseStream);
        int readLen;
        int buffSize = 4096;
        byte[] buff = new byte[buffSize];
        while (0 < (readLen = stdin.Read(buff, 0, buffSize)))
        {  
            p.StandardInput.BaseStream.Write(buff, 0, readLen);
            p.StandardInput.BaseStream.Flush();
        }
        p.StandardInput.Close();
    }
    p.WaitForExit();
}
// for loop
    // make System.IO.Stream stream, etc
    Run(bin7z, "a -t7z \"" + solid_archive_path + "\" -mx0 -si\"" + internal_archive_path + "\"", stream);

Когда он запускается, кажется, что он работает нормально и генерирует желаемую структуру пути, однако, когда архив начинает увеличиваться в размере, становится очевидным, что каждый раз, когда я добавляю новый файл, он копирует весь архив в .tmp, Это недопустимо, поскольку ожидается, что размер архива увеличится до ~3 ГБ и будет содержать несколько сотен файлов, что означает, что текущее поведение приводит к тому, что сотни и более ГБ копируются в общей сложности снова и снова, а копирование занимает намного больше времени, чем любой другой шаг.

Как я могу предотвратить это поведение? Я открыт для других решений по архивированию.


  • Ранее я пытался использовать tar-cs, но он будет выдавать ошибки каждый раз, когда файл был создан с internal_archive_path.Length > 100

  • Формат контейнера на самом деле не имеет значения, если он не сжат, и я могу извлечь из него файлы с их путями позже, когда захочу сделать обратное.

  • Моя среда настроена только на компиляцию C#

1 ответ

Вместо запуска 7z для создания несжатого 7zip-файла вы можете скопировать файлы в новый временный каталог с желаемой структурой пути.

Как только все файлы скопированы, запустите команду 7z, чтобы создать сжатый / несжатый архив 7z из временного каталога и, наконец, очистить временный каталог.

Другие вопросы по тегам