Извлечение файлов от Zip архивирует программно использующий C# и Систему. IO.Packaging

Вы используете одно и то же имя для окна (<Window Name="Search") и типа code-behind (public partial class Search). Вот на что жалуется компилятор. Поменяйте одно или другое, и оно будет работать.

47
задан Community 23 May 2017 в 11:53
поделиться

4 ответа

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

, Например, DotNetZip, который был недавно обновлен. Текущая версия теперь v1.8. Вот пример для создания zip:

using (ZipFile zip = new ZipFile())
{
  zip.AddFile("c:\\photos\\personal\\7440-N49th.png");
  zip.AddFile("c:\\Desktop\\2005_Annual_Report.pdf");
  zip.AddFile("ReadMe.txt");

  zip.Save("Archive.zip");
}

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

using (ZipFile zip = ZipFile.Read("ExistingArchive.zip"))
{
  // 1. remove an entry, given the name
  zip.RemoveEntry("README.txt");

  // 2. Update an existing entry, with content from the filesystem
  zip.UpdateItem("Portfolio.doc");

  // 3. modify the filename of an existing entry 
  // (rename it and move it to a sub directory)
  ZipEntry e = zip["Table1.jpg"];
  e.FileName = "images/Figure1.jpg";

  // 4. insert or modify the comment on the zip archive
  zip.Comment = "This zip archive was updated " + System.DateTime.ToString("G"); 

  // 5. finally, save the modified archive
  zip.Save();
}

вот пример, который извлекает записи:

using (ZipFile zip = ZipFile.Read("ExistingZipFile.zip"))
{
  foreach (ZipEntry e in zip)
  {
    e.Extract(TargetDirectory, true);  // true => overwrite existing files
  }
}

DotNetZip поддерживает многобайтовые символы в именах файлов, шифровании Zip, Шифровании AES, потоках, Unicode, самораспаковывающихся архивах. Также делает ZIP64, для длин файла, больше, чем 0xFFFFFFFF, или для архивов больше чем с 65 535 записями.

свободный. открытый исходный код

получает его в codeplex или прямая загрузка с windows.net - CodePlex был прекращен и заархивировал

47
ответ дан Eugen 26 November 2019 в 19:16
поделиться

От MSDN,

В этом образце, используется класс Пакета (в противоположность ZipPackage.) Работавший с обоими, я только видел, что облупленность происходит, когда существует повреждение в zip-файле. Не обязательно повреждение, которое бросает экстрактор Windows или Winzip, но что-то, что Упаковочные компоненты испытывают затруднения при обработке.

Hope, которой это помогает, возможно, это может предоставить Вам альтернативу отладке проблемы.

using System;
using System.IO;
using System.IO.Packaging;
using System.Text;

class ExtractPackagedImages
{
    static void Main(string[] paths)
    {
        foreach (string path in paths)
        {
            using (Package package = Package.Open(
                path, FileMode.Open, FileAccess.Read))
            {
                DirectoryInfo dir = Directory.CreateDirectory(path + " Images");
                foreach (PackagePart part in package.GetParts())
                {
                    if (part.ContentType.ToLowerInvariant().StartsWith("image/"))
                    {
                        string target = Path.Combine(
                            dir.FullName, CreateFilenameFromUri(part.Uri));
                        using (Stream source = part.GetStream(
                            FileMode.Open, FileAccess.Read))
                        using (Stream destination = File.OpenWrite(target))
                        {
                            byte[] buffer = new byte[0x1000];
                            int read;
                            while ((read = source.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                destination.Write(buffer, 0, read);
                            }
                        }
                        Console.WriteLine("Extracted {0}", target);
                    }
                }
            }
        }
        Console.WriteLine("Done");
    }

    private static string CreateFilenameFromUri(Uri uri)
    {
        char [] invalidChars = Path.GetInvalidFileNameChars();
        StringBuilder sb = new StringBuilder(uri.OriginalString.Length);
        foreach (char c in uri.OriginalString)
        {
            sb.Append(Array.IndexOf(invalidChars, c) < 0 ? c : '_');
        }
        return sb.ToString();
    }
}
44
ответ дан jro 26 November 2019 в 19:16
поделиться

От" Класс ZipPackage" (MSDN):

, В то время как Пакеты хранятся как zip-файлы* через класс ZipPackage, всеми zip-файлами не является ZipPackages. ZipPackage имеет особые требования, такие как совместимый URI файл (часть) имена и" [Content_Types].xml" файл, который определяет типы MIME для всех файлов, содержавшихся в Пакете. Класс ZipPackage не может использоваться для открытия arbitary zip-файлов, которые не соответствуют Открыть стандарту Packaging Conventions.

Для получения дальнейшей информации видят Раздел 9,2 "Отображений на Архив ZIP" ECMA International "Открытые Упаковочные Конвенции" стандарт, http://www.ecma-international.org/publications/files/ECMA-ST/Office%20Open%20XML%20Part%202%20 (DOCX) .zip (342 КБ) или http://www.ecma-international.org/publications/files/ECMA-ST/Office%20Open%20XML%20Part%202%20 (PDF) .zip (1.3 МБ)

, *You может просто добавить ".zip" к расширению любого находящегося в ZipPackage файла (.docx, .xlsx, .pptx, и т.д.) для открытия его в любимой утилите Zip.

31
ответ дан Peter Mortensen 26 November 2019 в 19:16
поделиться

Я согласовываю жгут из прутьев Cheeso. Система. IO.Packaging является неловким при обработке универсальных zip-файлов, наблюдении, поскольку он был разработан для Office Открытые XML-документы. Я предложил бы использовать DotNetZip или SharpZipLib

6
ответ дан Eugen 26 November 2019 в 19:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: