Создание твердого архива с внутренней структурой пути из сгенерированных файлов
Я пытаюсь создать надежный архив из сотен файлов, которые я позже сожму, но все, что я пытаюсь сделать, кажется, сталкивается с проблемой.
Файлы, подлежащие архивированию, создаются в моей программе, и я обращаюсь к ним как Stream
s. Они должны быть организованы в пути любой длины.
В настоящее время я передаю их в 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 из временного каталога и, наконец, очистить временный каталог.