Проблемы с SharpZipLib из-за Zip-файлов с \ вместо / - PullRequest
2 голосов
/ 15 марта 2011

У меня загружено несколько устаревших почтовых индексов.

Файлы были сохранены в zip-архиве, поэтому они являются папкой \ filename, а не папкой / filename.

Что это означает, код такой:

using (ZipFile zipFile = new ZipFile(@"zippath.zip"))
{ 
     for (int i = 0; i < zipFile.Count; i++)
     {
          var entry = zipFile[i];
          zipFile.BeginUpdate();
          zipFile.Delete(entry);
          zipFile.CommitUpdate();

...

Кидает

Не удается найти запись для удаления

Это известная проблема, найденная здесь , но, к сожалению, я не могу контролировать, как создаются молнии, и мне нужны годы работы с файлами ZIP Можно ли как-то исправить оператор удаления или восстановить (в C #) zip-файл перед его использованием?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 17 февраля 2012

Внутри ZipEntry есть открытая функция, которая очищает имя для вас. "ZipEntry.CleanName (yourstring)". Сделайте этот вызов, когда вы одновременно добавляете свою запись И пытаетесь удалить ее. примечание: Если вы используете это для путей к файлам, он будет правильно интерпретировать путь в zip-файле, даже если функция CleanName заменяет «\» на «/»

**

ДОБАВЛЕНИЕ ZIPENTRY

**

zipEntryKey = file.FullName.Replace(file.Directory.Root.ToString(), string.Empty);
zipEntryKey = ZipEntry.CleanName(zipEntryKey);
ZipEntry entry = new ZipEntry(zipEntryKey);
entry.DateTime = file.LastWriteTime;


Stream fileStream = Minify(file);
byte[] buffer = new byte[fileStream.Length];
entry.Size = fileStream.Length;
fileStream.Read(buffer, 0, buffer.Length);
fileStream.Close();

zipStream.PutNextEntry(entry);
zipStream.Write(buffer, 0, buffer.Length);
zipStream.CloseEntry();

УДАЛЕНИЕ ЗИПЕНТРИИ

zipEntryKey = file.FullName.Replace(file.Directory.Root.ToString(), string.Empty);
zipEntryKey = ZipEntry.CleanName(zipEntryKey);

if (existingZip.FindEntry(zipEntryKey, true) > -1)
{
    existingZip.BeginUpdate();
    ZipEntry Existing = existingZip[existingZip.FindEntry(zipEntryKey, true)];
    existingZip.Delete(Existing);
    existingZip.CommitUpdate();
}
0 голосов
/ 15 марта 2011

Похоже, что исправление находится внизу вашей ссылки . Один из разработчиков написал пост с кодом, который просто заменил символ \ на /. Попробуйте, и, возможно, оттуда вы можете удалить запись zip.

...