首页 新闻 会员 周边 捐助

请教关于用ICSharpCode.SharpZipLib做压缩的问题

0
悬赏园豆:60 [已关闭问题] 关闭于 2012-08-02 16:33

我写了代码,路径如下:

 

string[] array = new string[5]; 
array[0] = @"E:\实验\文件包\第6章 函数.wps"; 
array[1] = @"E:\实验\文件包\第8章 面向对象编程简介.wps"; array[2] = @"E:\实验\文件包\第9章 定义类.wps"; 
array[3] = @"E:\实验\文件包\第10章 定义类成员.wps";
array[4] = @"D:\新的"; //“新的”是一个文件夹 StartZip.Run(@"e:\", "压缩文件", array); 

因为路径直接指向文件,所以我希望压缩的结果是,所有文件都在压缩包的根目录下。但是发现压缩之后,array[0]到array[3]路径下的文件并不在压缩包的根目录下,而是变成“实验\文件包\*.wps”,并不在根目录下,请问问题出在哪呢?

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using System.Text.RegularExpressions;

namespace MyTest
{
    public static class StartZip
    {
        public static void Run(string rootDirectory, string zipFileName, params string[] fileOrDirectory)
        {
            if (fileOrDirectory == null || fileOrDirectory.Length < 1) return;
            Regex reg1 = new Regex(@"[a-z]:$", RegexOptions.IgnoreCase);
            Match math1 = reg1.Match(rootDirectory);
            if (math1.Success)
            { 
                rootDirectory =math1.Value+@"\";
            }
            int zipLevel = 6;
            string fullZipFileName = rootDirectory + zipFileName + ".zip";
            for (int count = 0; count < fileOrDirectory.Length; count++)
            {
                string str = fileOrDirectory[count];

                if (str.EndsWith("\\"))
                {
                    str = str.Substring(0, str.Length - 1);
                }

                str = str.Substring(0, str.LastIndexOf("\\"));

                Zip(fullZipFileName, str, zipLevel, fileOrDirectory);
            }
        }

        private static void Zip(string fullZipFileName, string currentDirectory, int zipLevel, params string[] fileOrDirectory)
        {
            ArrayList AllFiles = new ArrayList();   //AllFiles:存储具体文件路径的容器
            if (fileOrDirectory != null)
            {
                for (int i = 0; i < fileOrDirectory.Length; i++)
                {
                    if (File.Exists(fileOrDirectory[i]))
                    {
                        AllFiles.Add(fileOrDirectory[i]);
                    }
                    else if (Directory.Exists(fileOrDirectory[i]))
                    {
                        GetDirectoryFile(fileOrDirectory[i], AllFiles);
                    }
                }
            }
            
            if (AllFiles.Count < 1) return;

            ZipOutputStream zipedStream = new ZipOutputStream(File.Create(fullZipFileName));   //ZipOutputStream的new初始化:创建对应zipFileName文件名的Zip文件
            zipedStream.SetLevel(zipLevel);
            
            for (int i = 0; i < AllFiles.Count; i++)
            {
                string file = AllFiles[i].ToString();
                FileStream fs;
                fs = File.OpenRead(file);
                byte[] buffer = new byte[fs.Length];
                fs.Read(buffer, 0, buffer.Length);


                //新建一个entry
                string fileName = file.Replace(currentDirectory, "");
                if (fileName.StartsWith("\\"))
                {
                    fileName = fileName.Substring(1);
                }
                ZipEntry entry = new ZipEntry(fileName);
                entry.DateTime = DateTime.Now;
                fs.Close();
                zipedStream.PutNextEntry(entry);
                zipedStream.Write(buffer, 0, buffer.Length);
                fs.Close();
                fs.Dispose();
            }
            zipedStream.Finish();
            zipedStream.Close();
        }

        private static void GetDirectoryFile(string parentDirectory, ArrayList toStore)   //递归获取一个目录下的所有文件
        {
            string[] files = Directory.GetFiles(parentDirectory);   //Directory.GetFiles 方法 (String):返回指定目录中“文件”的名称(包括其路径);
            for (int i = 0; i < files.Length; i++)
            {
                toStore.Add(files[i]);
            }
            string[] directorys = Directory.GetDirectories(parentDirectory);   //Directory.GetDirectories 方法 (String):获取指定目录中的“子目录”的名称(包括其路径)。
            //“子目录”也即“子文件夹”;
            for (int i = 0; i < directorys.Length; i++)
            {
                GetDirectoryFile(directorys[i], toStore);
            }
        }
    }
}
芬陀利华的主页 芬陀利华 | 初学一级 | 园豆:106
提问于:2012-07-19 21:39
< >
分享
所有回答(1)
0

建议检查一下new ZipEntry(fileName)时fileName的值

dudu | 园豆:29568 (高人七级) | 2012-07-20 13:50

不好意思,最近比较忙,没来得及回。

fileName的值,我之前通过断点调试了,发现,文件夹的,fileName指向的是文件夹里面的子文件,而不是文件夹本身,这样就让我毫无头绪了。

支持(0) 反对(0) 芬陀利华 | 园豆:106 (初学一级) | 2012-07-24 09:10

不好意思,上次说漏了,我说的对象是网上的Demo,发现压缩对象是文件夹的时候,程序指向的却是文件夹里面的文件。

支持(0) 反对(0) 芬陀利华 | 园豆:106 (初学一级) | 2012-07-28 08:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册