Я знаю, что вы спрашивали о Java, но только для архивных целей я подумала, что внесу заметку о .NET.
DotNetZip - это библиотека .NET для zip-файлов, которая позволяет переименовывать записи. Как говорится в ответе Тома Хоутина, каталоги не являются первоклассными объектами в метаданных zip-файла, и в результате ни одна из известных мне zip-библиотек не предоставляет глагола «переименовать каталог». Но некоторые библиотеки позволяют переименовывать все записи, имена которых указывают на конкретный каталог, что дает желаемый результат.
В DotNetZip это выглядело бы так:
var regex = new Regex("/OldDirName/.*$");
int renameCount= 0;
using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
foreach (ZipEntry e in zip)
{
if (regex.IsMatch(e.FileName))
{
// rename here
e.FileName = e.FileName.Replace("/OldDirName/", "/NewDirName/");
renameCount++;
}
}
if (renameCount > 0)
{
zip.Comment = String.Format("This archive has been modified. {0} entries have been renamed.", renameCount);
// any changes to the entries are made permanent by Save()
zip.Save(); // could also save to a new zip file here
}
}
Вы также можете добавлять или удалять записи в разделе using.
Если вы сохраняете в тот же файл, то DotNetZip перезаписывает только измененные метаданные - заголовки записей и записи центрального каталога для переименованных записей, что экономит время при работе с большими архивами. Если вы сохраните в новый файл или поток, тогда все данные zip будут записаны.