.net 解压 zip 包完全不用第三方 library (.net unzip zip file without third party library)
2013-02-28 10:04
405 查看
用我下面贴出来的code 可直接使用其中的 public static void UnZip(string zipPath, string destFolder) 方法来解压zip包,没有用到任何第三方的library
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
namespace UnzipApp
{
public class MyZipPackage : IDisposable
{
private object zipPackage;
private MyZipPackage(object zPackage)
{
zipPackage = zPackage;
}
public static MyZipPackage OpenOnFile(string path)
{
Type type = typeof(System.IO.Packaging.Package).Assembly.GetType("MS.Internal.IO.Zip.ZipArchive");
var method = type.GetMethod("OpenOnFile", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
return new MyZipPackage(method.Invoke(null, new object[] { path, FileMode.Open, FileAccess.Read, FileShare.Read, false }));
}
public IEnumerable<MyZipFile> Files
{
get
{
var method = zipPackage.GetType().GetMethod("GetFiles", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
var zipFiles = method.Invoke(zipPackage, null) as System.Collections.IEnumerable;
foreach (var file in zipFiles)
{
yield return new MyZipFile(file);
}
}
}
public static void UnZip(string zipPath, string destFolder)
{
if (!Directory.Exists(destFolder))
{
Directory.CreateDirectory(destFolder);
}
using (var zip = MyZipPackage.OpenOnFile(zipPath))
{
string rootFolder = destFolder;
foreach (var file in zip.Files)
{
if (file.Name.EndsWith("/"))
{
string[] folders = file.Name.Split('/');
rootFolder = destFolder;
for (int i = 0; i < folders.Length; i++)
{
if (!Directory.Exists(Path.Combine(rootFolder, folders[i])))
{
Directory.CreateDirectory(Path.Combine(rootFolder, folders[i]));
}
rootFolder = Path.Combine(rootFolder, folders[i]);
}
}
}
foreach (var file in zip.Files)
{
if (!file.Name.EndsWith("/"))
{
string contentFilePath = Path.Combine(destFolder, file.Name);
try
{
using (System.IO.FileStream newFileStream = System.IO.File.Create(contentFilePath))
{
newFileStream.Close();
byte[] content = new byte[file.GetStream().Length];
file.GetStream().Read(content, 0, content.Length);
System.IO.File.WriteAllBytes(contentFilePath, content);
}
}
catch (DirectoryNotFoundException e)
{
string[] folders = file.Name.Split('/');
rootFolder = destFolder;
for (int i = 0; i < folders.Length - 1; i++)
{
if (!Directory.Exists(Path.Combine(rootFolder, folders[i])))
{
Directory.CreateDirectory(Path.Combine(rootFolder, folders[i]));
}
rootFolder = Path.Combine(rootFolder, folders[i]);
}
using (System.IO.FileStream newFileStream = System.IO.File.Create(contentFilePath))
{
newFileStream.Close();
byte[] content = new byte[file.GetStream().Length];
file.GetStream().Read(content, 0, content.Length);
System.IO.File.WriteAllBytes(contentFilePath, content);
}
}
}
}
}
}
public void Dispose()
{
((IDisposable)zipPackage).Dispose();
}
}
public class MyZipFile
{
internal object zipFile;
public MyZipFile(object zfile)
{
zipFile = zfile;
}
private object GetProperty(string name)
{
return zipFile.GetType().GetProperty(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).GetValue(zipFile, null);
}
public string Name
{
get { return (string)GetProperty("Name"); }
}
public Stream GetStream(FileMode mode = FileMode.Open, FileAccess access = FileAccess.Read)
{
var meth = zipFile.GetType().GetMethod("GetStream", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
return (Stream)meth.Invoke(zipFile, new object[] { mode, access });
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
namespace UnzipApp
{
public class MyZipPackage : IDisposable
{
private object zipPackage;
private MyZipPackage(object zPackage)
{
zipPackage = zPackage;
}
public static MyZipPackage OpenOnFile(string path)
{
Type type = typeof(System.IO.Packaging.Package).Assembly.GetType("MS.Internal.IO.Zip.ZipArchive");
var method = type.GetMethod("OpenOnFile", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
return new MyZipPackage(method.Invoke(null, new object[] { path, FileMode.Open, FileAccess.Read, FileShare.Read, false }));
}
public IEnumerable<MyZipFile> Files
{
get
{
var method = zipPackage.GetType().GetMethod("GetFiles", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
var zipFiles = method.Invoke(zipPackage, null) as System.Collections.IEnumerable;
foreach (var file in zipFiles)
{
yield return new MyZipFile(file);
}
}
}
public static void UnZip(string zipPath, string destFolder)
{
if (!Directory.Exists(destFolder))
{
Directory.CreateDirectory(destFolder);
}
using (var zip = MyZipPackage.OpenOnFile(zipPath))
{
string rootFolder = destFolder;
foreach (var file in zip.Files)
{
if (file.Name.EndsWith("/"))
{
string[] folders = file.Name.Split('/');
rootFolder = destFolder;
for (int i = 0; i < folders.Length; i++)
{
if (!Directory.Exists(Path.Combine(rootFolder, folders[i])))
{
Directory.CreateDirectory(Path.Combine(rootFolder, folders[i]));
}
rootFolder = Path.Combine(rootFolder, folders[i]);
}
}
}
foreach (var file in zip.Files)
{
if (!file.Name.EndsWith("/"))
{
string contentFilePath = Path.Combine(destFolder, file.Name);
try
{
using (System.IO.FileStream newFileStream = System.IO.File.Create(contentFilePath))
{
newFileStream.Close();
byte[] content = new byte[file.GetStream().Length];
file.GetStream().Read(content, 0, content.Length);
System.IO.File.WriteAllBytes(contentFilePath, content);
}
}
catch (DirectoryNotFoundException e)
{
string[] folders = file.Name.Split('/');
rootFolder = destFolder;
for (int i = 0; i < folders.Length - 1; i++)
{
if (!Directory.Exists(Path.Combine(rootFolder, folders[i])))
{
Directory.CreateDirectory(Path.Combine(rootFolder, folders[i]));
}
rootFolder = Path.Combine(rootFolder, folders[i]);
}
using (System.IO.FileStream newFileStream = System.IO.File.Create(contentFilePath))
{
newFileStream.Close();
byte[] content = new byte[file.GetStream().Length];
file.GetStream().Read(content, 0, content.Length);
System.IO.File.WriteAllBytes(contentFilePath, content);
}
}
}
}
}
}
public void Dispose()
{
((IDisposable)zipPackage).Dispose();
}
}
public class MyZipFile
{
internal object zipFile;
public MyZipFile(object zfile)
{
zipFile = zfile;
}
private object GetProperty(string name)
{
return zipFile.GetType().GetProperty(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).GetValue(zipFile, null);
}
public string Name
{
get { return (string)GetProperty("Name"); }
}
public Stream GetStream(FileMode mode = FileMode.Open, FileAccess access = FileAccess.Read)
{
var meth = zipFile.GetType().GetMethod("GetStream", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
return (Stream)meth.Invoke(zipFile, new object[] { mode, access });
}
}
}
相关文章推荐
- .NET下加压缩的类库(免费)DotNetZip Library
- 不用第三方工具解压zip档案
- dotnetziplibrary(dotnetziplib)解压中文文件名乱码解决方法
- Linux下解压zip乱码问题的解决(unzip)
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- macOS zip 打包加密和 unzip 解压
- grep file with a few patterns, then zip them without directory structures
- linux下压缩与解压(zip、unzip、tar)详解
- ZipFile解压文件
- Linux下的压缩(zip)解压(unzip)缩命令
- python 加压/解压 zip(zipfile模块的使用)
- unzip命令,linux下解压zip
- .NET中zip的压缩和解压——SharpCompress插件的使用
- linux zip/unzip err encoding压缩解压中文文件 乱码
- java.util.zip.ZipFile解压后被java占用问题。
- 一起谈.NET技术,ASP.NET缓存全解析7:第三方分布式缓存解决方案 Memcached和Cacheman
- [Mac, Unzip, 7za] Mac zip解压问题----need PK compat. v4.5 (can do v2.1)
- Centos中压缩(zip)和解压(unzip)命令
- 详解最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)
- Archive for required library: "xxxx" in project '*' cannot be read or is not a valid ZIP file