Comment décompresser tout.Fichier Zip du dossier en utilisant C # 4.0 et sans utiliser de Dll OpenSource?
j'ai un dossier contenant .ZIP files. Maintenant, je veux extraire les fichiers ZIP vers des dossiers spécifiques en utilisant C#, mais sans utiliser d'assemblage externe ou le .net Framework 4.5.
j'ai cherché, mais je n'ai trouvé aucune solution pour déballer *.fichiers zip à L'aide de la version 4.0 ou d'une version plus récente.
j'ai essayé GZipStream, mais il supporte seulement .gz et pas .les fichiers zip.
6 réponses
Ici est un exemple de msdn. System.IO.Compression.ZipFile
est faite pour ça:
using System;
using System.IO;
using System.IO.Compression;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string startPath = @"c:\example\start";
string zipPath = @"c:\example\result.zip";
string extractPath = @"c:\example\extract";
ZipFile.CreateFromDirectory(startPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, extractPath);
}
}
}
Edit: désolé, j'ai raté le fait que vous vous intéressiez à .NET 4.0 et en dessous. Obligatoire. cadre. net 4.5 et supérieur.
j'avais la même question et j'ai trouvé un article grand et très simple qui résout le problème. http://www.fluxbytes.com/csharp/unzipping-files-using-shell32-in-c/
vous aurez besoin de faire référence à la Bibliothèque COM appelée Microsoft Shell Controls and Automation (Interop.Shell32.dll)
Le code (prises intact de l'article, juste pour que vous voyez comment il est simple):
public static void UnZip(string zipFile, string folderPath)
{
if (!File.Exists(zipFile))
throw new FileNotFoundException();
if (!Directory.Exists(folderPath))
Directory.CreateDirectory(folderPath);
Shell32.Shell objShell = new Shell32.Shell();
Shell32.Folder destinationFolder = objShell.NameSpace(folderPath);
Shell32.Folder sourceFile = objShell.NameSpace(zipFile);
foreach (var file in sourceFile.Items())
{
destinationFolder.CopyHere(file, 4 | 16);
}
}
je recommande vivement la lecture de l'article - il apporte une explication pour les drapeaux 4/16
EDIT: après plusieurs années que mon application, qui utilise ceci, a fonctionné, j'ai reçu des plaintes de deux utilisateurs que tout d'un coup l'application a cessé de fonctionner. il semble que la fonction CopyHere crée des fichiers/dossiers temp et ceux-ci n'ont jamais été supprimés ce qui a causé des problèmes. L'emplacement de ces fichiers peut être trouvé dans le système.IO.Chemin.GetTempPath ().
ZipPackage peut-être un endroit pour commencer. It's inside Système.IO.Emballage et disponible en .net 4.0
pas du tout proche de la simplicité de la méthode .net 4.5 mentionnée ci-dessus, mais on dirait qu'elle peut faire ce que vous voulez.
.NET 3.5 a un Déflatestream pour cela. Vous devez créer des structures pour les informations sur les répertoires et autres, mais PKWare a publié ces informations. J'ai écrit un utilitaire de décompression et il n'est pas particulièrement onéreux lors de la création de leurs structures.
j'ai eu le même problème et je l'ai résolu en appelant 7-zip exécutable à travers cmd shell à partir de C# code, comme suit,
string zipped_path = "xxx.7z";
string unzipped_path = "yyy";
string arguments = "e " + zipped_path + " -o" + unzipped_path;
System.Diagnostics.Process process
= Launch_in_Shell("C:\Program Files (x86)\7-Zip\","7z.exe", arguments);
if (!(process.ExitCode == 0))
throw new Exception("Unable to decompress file: " + zipped_path);
Et Launch_in_Shell(...)
est définie comme
public static System.Diagnostics.Process Launch_in_Shell(string WorkingDirectory,
string FileName,
string Arguments)
{
System.Diagnostics.ProcessStartInfo processInfo
= new System.Diagnostics.ProcessStartInfo();
processInfo.WorkingDirectory = WorkingDirectory;
processInfo.FileName = FileName;
processInfo.Arguments = Arguments;
processInfo.UseShellExecute = true;
System.Diagnostics.Process process
= System.Diagnostics.Process.Start(processInfo);
return process;
}
Drawbacks: vous devez avoir 7zip installé sur votre machine et je ne l'ai essayé qu'avec ".7z fichiers". Espérons que cette aide.
dans .net 4.0 Deflate et GZip ne peuvent pas gérer les fichiers Zip, mais vous pouvez utiliser la fonction shell pour décompresser les fichiers.
public FolderItems Extract()
{
var shell = new Shell();
var sf = shell.NameSpace(_zipFile.Path);
return sf.Items();
}
lorsque la fonction d'extrait est appelée, Vous pouvez sauver les folderItems retournés par
FolderItems Fits = Extract();
foreach( var s in Fits)
{
shell.Namespace("TargetFolder").copyhere(s);
}