Ne ressemble à aucune bibliothèque/API intégrée en C # pour décompresser un fichier Zip. Je cherche une bibliothèque/API libre (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.
Toute bibliothèque/API ou exemples recommandés?
La GPL
http://www.icsharpcode.net/OpenSource/SharpZipLib/
OU le moins restrictif Ms-PL
http://www.codeplex.com/DotNetZip
Pour compléter cette réponse, le framework .net a ZipPackage j’ai eu moins de succès.
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 Windows Shell. J'ai utilisé dynamic
de Framework 4.0 dans cet exemple, mais vous pouvez obtenir les mêmes résultats en utilisant 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 de la 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, si vous souhaitez contrôler les noms de chemin des fichiers extraits, etc., etc., vous disposez de nombreuses 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 SDK 7Zip 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 de la page Exemples C # :
using (ZipFile Zip = ZipFile.Read(ExistingZipFile))
{
foreach (ZipEntry e in Zip)
{
e.Extract(TargetDirectory);
}
}
Jetez un coup d’œil à ma petite bibliothèque: http://zipstorer.codeplex.com
Si vous souhaitez utiliser la compression 7-Zip, consultez l'article EggheadCafe de Peter Bromberg . Attention: le le code source de LZMA for c # n'a pas de commentaire xml (en fait, très peu de commentaires du tout).
#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
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, veuillez consulter: http://msdn.Microsoft.com/en-us/magazine/cc163372.aspx Il existe un fichier d'exemple sous la figure 13 .
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 ().
SevenZipSharp est un wrapper autour de 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(...);
Je recommanderais notre http://www.rebex.net/Zip.net/ mais je suis partial. Téléchargez essayez et vérifiez vous-même les fonctions et les exemples.
Je préférerais SharpZiplib Veuillez trouver l'exemple de code pour UnZip Files in .Net C #