zip-怎么用C#语言在不引用DLL文件的情况下压解ZIP格式文件

问题描述

怎么用C#语言在不引用DLL文件的情况下压解ZIP格式文件

跪求高手指点,求指点大概思路,现在感觉什么思路都没有,不知道从那里下手

解决方案

利用C#反射技术动态调用dll方法,无需引用

解决方案二:

看看这个类行不行

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.IO.Compression;
using System.Collections;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;

namespace XCInternetExplorer
{
    /// <summary>
    /// 压缩文件
    /// </summary>
    public class CreateZip
    {
        #region 压缩解压单一文件
        /// <summary>
        /// 压缩单一文件
        /// </summary>
        /// <param name="sourceFile">源文件路径</param>
        /// <param name="destinationFile">目标文件路径</param>
        public static void CompressFile(string sourceFile, string destinationFile)
        {
            if (!File.Exists(sourceFile)) throw new FileNotFoundException();
            using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                byte[] buffer = new byte[sourceStream.Length];
                int checkCounter = sourceStream.Read(buffer, 0, buffer.Length);
                if (checkCounter != buffer.Length) throw new ApplicationException();
                using (FileStream destinationStream = new FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    using (GZipStream compressedStream = new GZipStream(destinationStream, CompressionMode.Compress, true))
                    {
                        compressedStream.Write(buffer, 0, buffer.Length);
                    }
                }
            }
        }

        public static void CompressFile(byte[] source, string destinationFile)
        {
            using (FileStream destinationStream = new FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write))
            {
                using (GZipStream compressedStream = new GZipStream(destinationStream, CompressionMode.Compress, true))
                {
                    compressedStream.Write(source, 0, source.Length);
                }
            }
        }

        /// <summary>
        /// 解压缩文件
        /// </summary>
        /// <param name="sourceFile">源文件路径</param>
        /// <param name="destinationFile">目标文件路径</param>
        public static void DecompressFile(string sourceFile, string destinationFile)
        {
            if (!File.Exists(sourceFile)) throw new FileNotFoundException();
            using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open))
            {
                byte[] quartetBuffer = new byte[4];
                int position = (int)sourceStream.Length - 4;
                sourceStream.Position = position;
                sourceStream.Read(quartetBuffer, 0, 4);
                sourceStream.Position = 0;
                int checkLength = BitConverter.ToInt32(quartetBuffer, 0);
                byte[] buffer = new byte[checkLength + 100];
                using (GZipStream decompressedStream = new GZipStream(sourceStream, CompressionMode.Decompress, true))
                {
                    int total = 0;
                    for (int offset = 0; ; )
                    {
                        int bytesRead = decompressedStream.Read(buffer, offset, 100);
                        if (bytesRead == 0) break;
                        offset += bytesRead;
                        total += bytesRead;
                    }
                    using (FileStream destinationStream = new FileStream(destinationFile, FileMode.Create))
                    {
                        destinationStream.Write(buffer, 0, total);
                        destinationStream.Flush();
                    }
                }
            }
        }

        #endregion

        #region 压缩解压文件夹
        /**/
        /// <summary>
        /// 对目标文件夹进行压缩,将压缩结果保存为指定文件
        /// </summary>
        /// <param name="dirPath">目标文件夹</param>
        /// <param name="fileName">压缩文件</param>
        public static void CompressFolder(string dirPath, string fileName)
        {
            ArrayList list = new ArrayList();
            foreach (string f in Directory.GetFiles(dirPath))
            {
                byte[] destBuffer = File.ReadAllBytes(f);
                SerializeFileInfo sfi = new SerializeFileInfo(f, destBuffer);
                list.Add(sfi);
            }
            IFormatter formatter = new BinaryFormatter();
            using (Stream s = new MemoryStream())
            {
                formatter.Serialize(s, list);
                s.Position = 0;
                CreateCompressFile(s, fileName);
            }
        }
        /**/
        /// <summary>
        /// 对目标压缩文件解压缩,将内容解压缩到指定文件夹
        /// </summary>
        /// <param name="fileName">压缩文件</param>
        /// <param name="dirPath">解压缩目录</param>
        public static void DeCompressFolder(string fileName, string dirPath)
        {
            using (Stream source = File.OpenRead(fileName))
            {
                using (Stream destination = new MemoryStream())
                {
                    using (GZipStream input = new GZipStream(source, CompressionMode.Decompress, true))
                    {
                        byte[] bytes = new byte[4096];
                        int n;
                        while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
                        {
                            destination.Write(bytes, 0, n);
                        }
                    }
                    destination.Flush();
                    destination.Position = 0;
                    DeSerializeFiles(destination, dirPath);
                }
            }
        }
        private static void DeSerializeFiles(Stream s, string dirPath)
        {
            BinaryFormatter b = new BinaryFormatter();
            ArrayList list = (ArrayList)b.Deserialize(s);
            foreach (SerializeFileInfo f in list)
            {
                string newName = dirPath + Path.GetFileName(f.FileName);
                using (FileStream fs = new FileStream(newName, FileMode.Create, FileAccess.Write))
                {
                    fs.Write(f.FileBuffer, 0, f.FileBuffer.Length);
                    fs.Close();
                }
            }
        }
        private static void CreateCompressFile(Stream source, string destinationName)
        {
            using (Stream destination = new FileStream(destinationName, FileMode.Create, FileAccess.Write))
            {
                using (GZipStream output = new GZipStream(destination, CompressionMode.Compress))
                {
                    byte[] bytes = new byte[4096];
                    int n;
                    while ((n = source.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        output.Write(bytes, 0, n);
                    }
                }
            }
        }

        #endregion
    }
    //测试
    //private void btnZip_Click(object sender, EventArgs e)
    //{
    //    Common.Zip.CompressFile("database.mdb", "test.zip");
    //    Common.Zip.CompressFolder("sourcefolder", "sourcefolder.zip");
    //}

    //private void btnUnZip_Click(object sender, EventArgs e)
    //{
    //    Common.Zip.DecompressFile("test.zip", "database2.mdb");
    //    Common.Zip.DeCompressFolder("sourcefolder.zip", "folder/");
    //}
    [Serializable]
    class SerializeFileInfo
    {
        public SerializeFileInfo(string name, byte[] buffer)
        {
            fileName = name;
            fileBuffer = buffer;
        }
        string fileName;
        public string FileName
        {
            get
            {
                return fileName;
            }
        }
        byte[] fileBuffer;
        public byte[] FileBuffer
        {
            get
            {
                return fileBuffer;
            }
        }
    }
}

时间: 2024-09-08 22:26:33

zip-怎么用C#语言在不引用DLL文件的情况下压解ZIP格式文件的相关文章

python引用DLL文件的方法

  本文实例讲述了python引用DLL文件的方法.分享给大家供大家参考.具体分析如下: 在python中调用dll文件中的接口比较简单,如我们有一个test.dll文件,内部定义如下: ? 1 2 3 4 5 6 7 extern "C" { int __stdcall test( void* p, int len) { return len; } } 在python中我们可以用以下两种方式载入 1. ? 1 2 import ctypes dll = ctypes.windll.L

win7系统zip格式文件,怎么指向WinRAR解压

很早以前windows系统的解压软件还不支持解压ZIP格式,那时候很多网友说连这么出名的格式都不支持.而现在支持了也没有感觉中的好用,感觉可有可无. 1 而在win7系统中,如果遇到zip格式的文件,是可以直接提取出来,而不是解压出来.一般情况下有提取也就够了. 但是如果你感觉用解压出来更好用,那就跟着小编去修改注册表吧! 2 点击开始,然后再出现的框框里面输入regedit,按下回车. 在出现的注册表编辑器定位到:HKEY_CLASSES_ROOTCLSID分支(如图1)和HKEY_CLASS

在C#中引用DLL文件后,程序运行一段时间,内存就会不断增加?

问题描述 在C#中引用DLL文件mydll.dll程序中,建立一个对象mydll.class1ob=newmydll.class1();在程序的最后需要deleteob吗?如何去delete这个对象?是不是要在dll文件中,写一个函数delete(),然后在C#中调用这个函数?不知道我说清楚了没有,主要是我现在的程序连续运行时间一天左右,内存就会缓慢的不停的增加我怕是内存泄露,但是刚接触这方面知识,不是很明白.看了一些资料,说new一个对象后就要delete但是又看到资料说,C#本身就带有自动回

java,有没有拖动文件到窗口,然后获得该文件路径的方法。C语言有.

问题描述 java,有没有拖动文件到窗口,然后获得该文件路径的方法.C语言有. 这样化简和替代了,浏览选择文件的过程.拖文件进窗口,即可完成路径的指定 解决方案 http://blog.csdn.net/bolink5/article/details/4499544

php生成zip压缩文件的方法详解_php技巧

复制代码 代码如下: require_once "./include/zip.php"; $zip = new PHPZip(); //$zip -> createZip("要压缩的文件夹目录地址", "压缩后的文件名.zip"); //只生成不自动下载 $zip -> downloadZip("要压缩的文件夹目录地址", "压缩后的文件名.zip"); //自动下载 实例:可以参考下面的伪代码

c语言计时函数返回时间不定,求详解为什么(只点击了两次运行,并未改变代码)

问题描述 c语言计时函数返回时间不定,求详解为什么(只点击了两次运行,并未改变代码) 代码如上, 结果如下: 第一次 第二次: 解决方案 同样的代码,执行过程中计算机可能遇到各种小问题,一般来说短期内第二次运行会快点. 第一次会进行资源的分配,将代码拷到内存里,再执行. 如果在很短的时间内进行第二次运行,代码还在内存里,CPU少了将代码拷到内存的操作,所以会快上一点. 你问的这个问题设计到了操作系统的CPU局部性策略,操作系统在执行程序时,并不是像C一样,顺序执行,因为同一时间,并不是只有你的程

std move-返回右值引用为什么在下面的情况出错

问题描述 返回右值引用为什么在下面的情况出错 #include void main() { std::vector a=getvec(); } std::vector && getvec() { std::vector a; a.push_back(1); return std::move(a); } //返回的是空的向量 解决方案 std::vector<int> && a=getvec(); 解决方案二: 非常抱歉,因为是临时写的,主要是想问的是返回局部变量

remoting引用dll的问题

问题描述 以下是一个远程对象类的定义:publicclassServerObject:MarshalByRefObject{ publicPersonGetPersonInfo(stringname,stringsex,intage) { Personperson=newPerson(); person.Name=name; person.Sex=sex; person.Age=age; returnperson; }} 这个类只实现了最简单的方法,就是设置一个人的基本信息,并返回一个Perso

c# dll回调-C# 主程序引用DLL,当DLL里的方法被调用时,回调给主程序。

问题描述 C# 主程序引用DLL,当DLL里的方法被调用时,回调给主程序. 主程序引用DLL,当DLL里的方法被调用时,回调给主程序.大概就是这样子.求大神代码.最好完整些有注释