Библиотека System.IO.Packaging не читает стандартные zip-файлы Windows - PullRequest
0 голосов
/ 23 ноября 2011

При чтении zip-пакета с использованием сборки System.IO.Packaging я обнаружил, что zip-файлы, созданные с помощью стандартной утилиты windows zip, не могут быть прочитаны (части пакета (внутренние файлы) zip-пакета отображаются как несуществующие) ,

После некоторых исследований выясняется, что это связано с тем, что библиотека System.IO.Packaging добавляет в архив zip Content_Types.xml , который отсутствует в стандартном сжатом zip-архиве Windows. .

Пример:

using (Package Zip = Package.Open(BundlePath, FileMode.Open))
{
    Uri FileUri = PackUriHelper.CreatePartUri(new Uri("somefile.xml", UriKind.Relative));
    if (!Zip.PartExists (FileUri ))  //this fails even though the file exists in the zip
        throw new ResourceException(String.Format("Zip {0} does not contain file", BundlePath));
    ...

В любом случае можно ли использовать систему упаковки, предоставляемую .NET, для чтения стандартных zip-файлов, или их необходимо создавать с помощью библиотеки.

Edit:

Добавление этого файла (Content_Types.xml) вручную и архивирование с помощью утилиты сжатия Windows позволяет успешно читать пакет.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 23 ноября 2011

System.IO.Packaging не для чтения zip-файлов, а для пакетов.Вместо этого используйте DotnetZip .

1 голос
/ 23 ноября 2011

К сожалению, я верю, что вы правы. Нет хорошего способа заставить библиотеки System.IO.Packaging открывать любой файл в стандартном формате zip, который не содержит этот файл [content_types] .xml.

Я работал над этой проблемой несколько месяцев назад, и именно это я пытался реализовать, внедряя этот файл до того, как мы решили сначала сгенерировать все наши файлы из .NET:

формат файла zip следующий

(--- файл 1 ---) (--- файл 2 ---) ... (---file x ---) (оглавление)

Без сторонней библиотеки вы сможете открыть zip-файл в виде двоичного файла, перепрыгнуть до конца и прочитать это оглавление,добавьте файл [content_types] .xml в конце с информацией о расширениях types / default, настройте записи в оглавлении, добавьте его в конец файла и перейдите.Проблема, с которой я столкнулся, пытаясь реализовать это, состоит в том, что в файле есть различные контрольные суммы, чтобы убедиться, что он не был поврежден, я не получил их все к тому времени, когда мне нужно было изменить указания на этом.

Я уверен, что вам нужна дополнительная информация, но, если вы решите внедрить собственное решение, надеюсь, это поможет.

...