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-файлов.