C#: программно создать разделенный почтовый файл

Я хочу создать zip-файл из папки размером около 1,5 ГБ, и этот zip-файл должен быть разбит на куски по 100 МБ. Я нашел немало тем по этому вопросу, но у меня ничего не получилось.

Сначала я попробовал System.IO.Compression, но обнаружил, что он не поддерживает разбиение zip-файлов (исправьте меня, если я ошибаюсь!).

Затем я попробовал Ionic.zip, который выглядел очень просто, но каждый созданный мной набор файлов каким-то образом поврежден (например, следующий код, использующий каталог fonts в качестве тестового каталога, создает набор файлов, которые я не могу затем откройте или разархивируйте как архив с помощью winzip или winrar):

using (var zipFile = new Ionic.Zip.ZipFile(Encoding.UTF8))
{
    zipFile.AddDirectory("c:\\windows\\fonts", directoryPathInArchive: string.Empty);
    zipFile.MaxOutputSegmentSize = 100 * 1000000;
    zipFile.Save("c:\\users\\me\\test.zip");
}

Наконец, я попробовал 7z.dll и SharpCompress. Используя командную строку и файл 7z.exe, следующее прекрасно работает:

7z.exe a "c:\users\me\test.zip" "c:\Windows\Fonts" -v100m

Но следующий код выдает ошибку "Значение не попадает в ожидаемый диапазон".

SevenZipCompressor.SetLibraryPath("c:\\program files\\7-zip\\7z.dll");
var compressor = new SevenZipCompressor();
compressor.CompressionMethod = CompressionMethod.Lzma2;
compressor.CustomParameters.Add("v", "100m");
compressor.CompressDirectory("c:\\windows\\fonts\\", "c:\\users\\me\\test.zip");

Я также попробовал следующее (пытаясь выяснить, как переключатели командной строки работают в SharpCompress), которое создает файл zip, но не разбивает его на части:

SevenZipCompressor.SetLibraryPath("c:\\program files\\7-zip\\7z.dll");
var compressor = new SevenZipCompressor();
compressor.CompressionMethod = CompressionMethod.Lzma2;
compressor.CustomParameters.Add("mt", "on");
compressor.CustomParameters.Add("0", "LZMA2:c=100m");
compressor.CompressDirectory("c:\\windows\\fonts\\", "c:\\users\\me\\test.zip");

Кто-нибудь знает, почему ни один из вышеперечисленных методов не работает? Или есть другие способы работы людей, которые я еще не пробовал?

Спасибо!

1 ответ

Это старый вопрос, но Ionic работает. Может быть, немного сложно, но ладно. Моя первая версия также создает набор файлов, которые я не могу распаковать. Но после изменения порядка команд вывод можно разархивировать.

    private static void CreateEncryptedZipFile(string filename, string to, FileInfo fi, string password)
    {
        using (var zipFile = new Ionic.Zip.ZipFile())
        {
            zipFile.Password = password;
            zipFile.Encryption = Ionic.Zip.EncryptionAlgorithm.WinZipAes256;
            zipFile.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
            zipFile.AddFile(filename, directoryPathInArchive: string.Empty);
            zipFile.MaxOutputSegmentSize = 1024*1024*128;
            zipFile.Save(to + ".zip");
        }
        createXMLInfo(fi, to);
    }

Мне не известна библиотека, которая поддерживает формат PKZIP с разделением zip-файлов.

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