it-swarm.com.ru

порекомендуйте библиотеку/API для распаковки файла в C #

Похоже, нет встроенной библиотеки/API в C # для распаковки Zip-файла. Я ищу бесплатную (лучше с открытым исходным кодом) библиотеку/API, которая могла бы работать с .Net 3.5 + VSTS 2008 + C #, чтобы разархивировать Zip-файл и извлечь все файлы в определенную папку.

Любая рекомендуемая библиотека/API или образцы?

47
George2

GPL 

http://www.icsharpcode.net/OpenSource/SharpZipLib/

ИЛИ менее строгие Ms-PL

http://www.codeplex.com/DotNetZip

Чтобы завершить этот ответ .NET Framework имеет ZipPackage я имел меньший успех с ним. 

34
Sam Saffron

Если вам нужно только распаковать содержимое файла в папку, и вы знаете, что будете работать только в Windows, вы можете использовать объект оболочки Windows. В этом примере я использовал dynamic из Framework 4.0, но вы можете достичь тех же результатов, используя Type.InvokeMember.

dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));

dynamic compressedFolderContents = shellApplication.NameSpace(sourceFile).Items;
dynamic destinationFolder = shellApplication.NameSpace(destinationPath);

destinationFolder.CopyHere(compressedFolderContents);

Вы можете использовать FILEOP_FLAGS для управления поведением метода CopyHere.

24
Simon MᶜKenzie

DotNetZip прост в использовании. Вот распакованный образец

using (var Zip = Ionic.Zip.ZipFile.Read("archive.Zip"))
{
   Zip.ExtractAll("unpack-directory");
}

Если у вас есть более сложные потребности, например, вы хотите выбрать, какие записи извлекать, или если есть пароли, или если вы хотите контролировать пути к извлеченным файлам, или и т.д. И т.д., Существует множество вариантов. , Проверьте файл справки для большего количества примеров. 

DotNetZip является бесплатным и открытым исходным кодом.

17
Cheeso

В прошлом я использовал DotNetZip (MS-PL), SharpZipLib (GPL) и 7Zip SDK для C # (общественное достояние). Все они прекрасно работают, и с открытым исходным кодом. 

Я бы выбрал DotNetZip в этой ситуации, и вот пример кода со страницы C # Примеры :

using (ZipFile Zip = ZipFile.Read(ExistingZipFile))
{
  foreach (ZipEntry e in Zip)
  {
    e.Extract(TargetDirectory);
  }
}
10
Maxim Zaslavsky
7
Henri

Посмотрите мою маленькую библиотеку: http://zipstorer.codeplex.com

4
Jaime Olivares

Если вы хотите использовать сжатие 7-Zip, прочитайте статью Питера Бромберга EggheadCafe . Осторожно: исходный код LZMA для c # не имеет комментариев xml (на самом деле, совсем немного комментариев).

2
C-Pound Guru
    #region CreateZipFile
    public void StartZip(string directory, string zipfile_path)
    {
        Label1.Text = "Please wait, taking backup";
            #region Taking files from root Folder
                string[] filenames = Directory.GetFiles(directory);

                // path which the Zip file built in 
                ZipOutputStream p = new ZipOutputStream(File.Create(zipfile_path));
                foreach (string filename in filenames)
                {
                    FileStream fs = File.OpenRead(filename);
                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                    ZipEntry entry = new ZipEntry(filename);
                    p.PutNextEntry(entry);
                    p.Write(buffer, 0 , buffer.Length);
                    fs.Close();
                }
            #endregion

            string dirName= string.Empty;
            #region Taking folders from root folder
                DirectoryInfo[] DI = new DirectoryInfo(directory).GetDirectories("*.*", SearchOption.AllDirectories);
                foreach (DirectoryInfo D1 in DI)
                {

                    // the directory you need to Zip 
                    filenames = Directory.GetFiles(D1.FullName);
                    if (D1.ToString() == "backup")
                    {
                        filenames = null;
                        continue;
                    }
                    if (dirName == string.Empty)
                    {
                        if (D1.ToString() == "updates" || (D1.Parent).ToString() == "updates" || (D1.Parent).Parent.ToString() == "updates" || ((D1.Parent).Parent).Parent.ToString() == "updates" || (((D1.Parent).Parent).Parent).ToString() == "updates" || ((((D1.Parent).Parent).Parent)).ToString() == "updates")
                        {
                            dirName = D1.ToString();
                            filenames = null;
                            continue;
                        }
                    }
                    else
                    {
                        if (D1.ToString() == dirName) ;
                    }
                    foreach (string filename in filenames)
                    {
                        FileStream fs = File.OpenRead(filename);
                        byte[] buffer = new byte[fs.Length];
                        fs.Read(buffer, 0, buffer.Length);
                        ZipEntry entry = new ZipEntry(filename);
                        p.PutNextEntry(entry);
                        p.Write(buffer, 0, buffer.Length);
                        fs.Close();
                    }
                    filenames = null;
                }
                p.SetLevel(5);
                p.Finish();
                p.Close();
           #endregion
    }
    #endregion

    #region EXTRACT THE Zip FILE
    public bool UnZipFile(string InputPathOfZipFile, string FileName)
    {
        bool ret = true;
        Label1.Text = "Please wait, extracting downloaded file";
        string zipDirectory = string.Empty;
        try
        {
            #region If Folder already exist Delete it
            if (Directory.Exists(Server.MapPath("~/updates/" + FileName))) // server data field
            {
                String[] files = Directory.GetFiles(Server.MapPath("~/updates/" + FileName));//server data field
                foreach (var file in files)
                    File.Delete(file);
                Directory.Delete(Server.MapPath("~/updates/" + FileName), true);//server data field
            }
            #endregion


            if (File.Exists(InputPathOfZipFile))
            {
                string baseDirectory = Path.GetDirectoryName(InputPathOfZipFile);

                using (ZipInputStream ZipStream = new

                ZipInputStream(File.OpenRead(InputPathOfZipFile)))
                {
                    ZipEntry theEntry;
                    while ((theEntry = ZipStream.GetNextEntry()) != null)
                    {
                        if (theEntry.IsFile)
                        {
                            if (theEntry.Name != "")
                            {
                                string directoryName = theEntry.Name.Substring(theEntry.Name.IndexOf(FileName)); // server data field

                                string[] DirectorySplit = directoryName.Split('\\');
                                for (int i = 0; i < DirectorySplit.Length - 1; i++)
                                {
                                    if (zipDirectory != null || zipDirectory != "")
                                        zipDirectory = zipDirectory + @"\" + DirectorySplit[i];
                                    else
                                        zipDirectory = zipDirectory + DirectorySplit[i];
                                }
                                string first = Server.MapPath("~/updates") + @"\" + zipDirectory;
                                if (!Directory.Exists(first))
                                    Directory.CreateDirectory(first);


                                string strNewFile = @"" + baseDirectory + @"\" + directoryName;


                                if (File.Exists(strNewFile))
                                {
                                    continue;
                                }
                                zipDirectory = string.Empty;

                                using (FileStream streamWriter = File.Create(strNewFile))
                                {
                                    int size = 2048;
                                    byte[] data = new byte[2048];
                                    while (true)
                                    {
                                        size = ZipStream.Read(data, 0, data.Length);
                                        if (size > 0)
                                            streamWriter.Write(data, 0, size);
                                        else
                                            break;
                                    }
                                    streamWriter.Close();
                                }
                            }
                        }
                        else if (theEntry.IsDirectory)
                        {
                            string strNewDirectory = @"" + baseDirectory + @"\" +

                            theEntry.Name;
                            if (!Directory.Exists(strNewDirectory))
                            {
                                Directory.CreateDirectory(strNewDirectory);
                            }
                        }
                    }
                    ZipStream.Close();
                }
            }
        }
        catch (Exception ex)
        {
            ret = false;
        }
        return ret;
    }  
    #endregion
1
Asif

Если вы не хотите использовать внешний компонент, вот код, который я разработал вчера вечером с использованием класса .NET ZipPackage.

private static void Unzip()
{
    var zipFilePath = "c:\\myfile.Zip";
    var tempFolderPath = "c:\\unzipped";

    using (Package pkg = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read))
    {
        foreach (PackagePart part in pkg.GetParts())
        {
            var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/')));
            var targetDir = target.Remove(target.LastIndexOf('\\'));

            if (!Directory.Exists(targetDir))
                Directory.CreateDirectory(targetDir);

            using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read))
            {
                CopyStream(source, File.OpenWrite(target));
            }
        }
    }
}

private static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[4096];
    int read;
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, read);
    }
} 

Что следует отметить:

  • Zip-архив ДОЛЖЕН иметь в своем корне файл [Content_Types] .xml. Это не было проблемой для моих требований, так как я буду контролировать архивирование любых Zip-файлов, извлекаемых из этого кода. Для получения дополнительной информации о файле [Content_Types] .xml, пожалуйста, обратитесь к: http://msdn.Microsoft.com/en-us/magazine/cc163372.aspx Ниже приведен пример файла рисунка 13 статьи ,.

  • Я не проверял метод CopyStream, чтобы убедиться, что он ведет себя правильно, так как я изначально разработал его для .NET 4.0 с использованием метода Stream.CopyTo ().

1
Joshua

SevenZipSharp - это обертка вокруг 7z.dll и LZMA SDK, которая является открытым исходным кодом и бесплатна. 

SevenZipCompressor compressor = new SevenZipCompressor(); 
compressor.CompressionLevel = CompressionLevel.Ultra;
compressor.CompressionMethod = CompressionMethod.Lzma;
compressor.CompressionMode = CompressionMode.Create;
compressor.CompressFiles(...);
0
d.popov

Я бы порекомендовал наш http://www.rebex.net/Zip.net/ но я пристрастен. Скачать пробную версию и проверить функции и образцы самостоятельно.

0
Martin Vobr

Я бы предпочел SharpZiplib Пожалуйста, найдите пример кода UnZip Files в .Net C #

0
logiclabz