Как распаковать все .Zip файлы из папки с помощью С# 4.0 и без использования OpenSource Dll?
У меня есть папка, содержащая .ZIP файлы. Теперь я хочу извлечь ZIP файлы в определенные папки с помощью С#, но без использования какой-либо внешней сборки или .NET Framework 4.5.
Я искал, но не нашел решения для распаковки *.zip файлов с использованием Framework 4.0 или ниже.
Я попробовал GZipStream, но он поддерживает только файлы .gz, а не .zip.
Ответы
Ответ 1
Вот пример из msdn. System.IO.Compression.ZipFile
выполняется только для этого:
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);
}
}
}
Изменить: Извините, я пропустил, что вы заинтересованы в .NET 4.0 и ниже.
Обязательная среда .NET 4.5 и выше.
Ответ 2
У меня был такой же вопрос, и я нашел замечательную и очень простую статью, которая решает проблему.
http://www.fluxbytes.com/csharp/unzipping-files-using-shell32-in-c/
вам нужно будет ссылаться на
COM-библиотека под названием Microsoft Shell Controls and Automation (Interop.Shell32.dll)
Код (снятый из статьи только для того, чтобы вы поняли, насколько это просто):
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);
}
}
настоятельно рекомендую прочитать статью - он приводит объяснение для флагов 4 | 16
EDIT: после нескольких лет работы моего приложения, которое использует это, у меня появились жалобы от двух пользователей, которые внезапно перестали работать.
похоже, что функция CopyHere создает временные файлы/папки, и они никогда не удалялись, что вызывало проблемы.
Местоположение этих файлов можно найти в System.IO.Path.GetTempPath().
Ответ 3
ZipPackage может быть местом для начала. Он находится внутри System.IO.Packaging и доступен в .NET 4.0
Не где-то рядом с простотой упомянутого выше метода .NET 4.5, но похоже, что он может делать то, что вы хотите.
Ответ 4
В .NET 3.5 для этого используется DeflateStream. Вы должны создавать структуры для информации о каталогах и т.д., Но PKWare опубликовала эту информацию. Я написал утилиту unzip, и это не является особенно обременительным, как только вы создадите для него структуры.
Ответ 5
У меня была такая же проблема, и я решил ее, вызвав 7-zip-исполняемый файл через CMD-оболочку из кода С# следующим образом:
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);
И где Launch_in_Shell(...)
определяется как,
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;
}
Недостатки: вам необходимо установить 7zip на вашем компьютере, и я только пробовал его с файлами ".7z". Надеюсь, это поможет.
Ответ 6
Вы можете использовать DotNetZip (с открытым исходным кодом) '
string zipFilePath = "C:\\sample.zip";
string extractedFilePath = "C:\\sampleFolder";
ZipFile zipfile = ZipFile.Read(zipFilePath);
if (!Directory.Exists(extractedFilePath))
Directory.CreateDirectory(extractedFilePath);
foreach (ZipEntry e in zipfile)
{
e.Extract(extractedFilePath,ExtractExistingFileAction.OverwriteSilently);
}'
Ответ 7
В .net 4.0 Deflate и GZip не могут обрабатывать Zip файлы, но вы можете использовать функцию оболочки для распаковки файлов.
public FolderItems Extract()
{
var shell = new Shell();
var sf = shell.NameSpace(_zipFile.Path);
return sf.Items();
}
Когда вызывается функция Function, вы можете сохранить возвращенные элементы папки
FolderItems Fits = Extract();
foreach( var s in Fits)
{
shell.Namespace("TargetFolder").copyhere(s);
}