recommander une bibliothèque / API pour décompresser un fichier en C # [fermé]
Question
Ne pas décompresser un fichier zip par une bibliothèque / API intégrée en C #. Je recherche une bibliothèque / API gratuite (meilleure open source) qui pourrait fonctionner avec .Net 3.5 + VSTS 2008 + C # pour décompresser un fichier zip et extraire tous les fichiers dans un dossier spécifique.
Une bibliothèque / API ou des échantillons recommandés?
La solution
La GPL
http://www.icsharpcode.net/OpenSource/SharpZipLib/
OU le Ms-PL moins restrictif
http://www.codeplex.com/DotNetZip
Pour compléter cette réponse, le framework .net a ZipPackage J'ai eu moins de succès avec cela.
Autres conseils
Si vous souhaitez simplement décompresser le contenu d'un fichier dans un dossier et savoir que vous ne l'exécuterez que sous Windows, vous pouvez utiliser l'objet Shell Windows. J'ai utilisé dynamic
à partir de Framework 4.0 dans cet exemple, mais vous pouvez obtenir les mêmes résultats avec Type.InvokeMember
.
dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
dynamic compressedFolderContents = shellApplication.NameSpace(sourceFile).Items;
dynamic destinationFolder = shellApplication.NameSpace(destinationPath);
destinationFolder.CopyHere(compressedFolderContents);
Vous pouvez utiliser FILEOP_FLAGS pour contrôler le comportement du . Méthode CopyHere
.
DotNetZip est facile à utiliser. Voici un exemple de décompression
using (var zip = Ionic.Zip.ZipFile.Read("archive.zip"))
{
zip.ExtractAll("unpack-directory");
}
Si vous avez des besoins plus complexes, par exemple si vous voulez choisir les entrées à extraire, s'il existe des mots de passe, ou si vous souhaitez contrôler les noms de chemin des fichiers extraits, etc., etc., beaucoup d'options. Consultez le fichier d'aide pour plus d'exemples.
DotNetZip est gratuit et open source.
Dans le passé, j’utilisais DotNetZip (MS-PL), SharpZipLib (GPL), et le 7ZIP SDK pour C # (domaine public). Ils fonctionnent tous très bien et sont open source.
Je choisirais DotNetZip dans cette situation, et voici un exemple de code provenant du C #. Exemples de page :
using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
foreach (ZipEntry e in zip)
{
e.Extract(TargetDirectory);
}
}
Consultez ma petite bibliothèque: http://zipstorer.codeplex.com
Si vous souhaitez utiliser la compression 7-zip, consultez la page Article d'EggheadCafe . Attention: le le code source LZMA pour c # n'a pas de commentaire xml (en fait, très peu de commentaires du tout).
Si vous ne souhaitez pas utiliser de composant externe, voici le code que j'ai développé la nuit dernière à l'aide de la classe ZipPackage de .NET.
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);
}
}
Choses à noter:
-
L'archive ZIP DOIT avoir un fichier [Content_Types] .xml à la racine. Ce n'était pas un problème pour mes besoins car je contrôlerai la compression de tous les fichiers ZIP extraits par ce code. Pour plus d'informations sur le fichier [Content_Types] .xml, reportez-vous à: http: / /msdn.microsoft.com/en-us/magazine/cc163372.aspx Il existe un exemple de fichier sous la figure 13 de l'article.
-
Je n'ai pas testé la méthode CopyStream pour s'assurer qu'elle se comporte correctement, car je l'avais initialement développée pour .NET 4.0 à l'aide de la méthode Stream.CopyTo ().
#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
Je préférerais SharpZiplib S'il vous plaît trouver l'exemple de code à Unzip Files in. Net C #
Je recommanderais notre http://www.rebex.net/zip.net/ mais je suis partial. Téléchargez la version d'évaluation et vérifiez les fonctionnalités et les exemples vous-même.
SevenZipSharp est un wrapper autour de tha 7z.dll et du SDK LZMA, qui est Open-source et gratuit. .
SevenZipCompressor compressor = new SevenZipCompressor();
compressor.CompressionLevel = CompressionLevel.Ultra;
compressor.CompressionMethod = CompressionMethod.Lzma;
compressor.CompressionMode = CompressionMode.Create;
compressor.CompressFiles(...);