日期:2014-05-18  浏览次数:20923 次

使用ICSharpCode.SharpZipLib.dll遇到的问题
想用C#写一个压缩文件夹的功能,对文件夹进行压缩。
找了一段代码试了一下。能生成zip文件,但是用winrar解压的时候出现错误:CRC失败,文件被破坏。放到linux上用unzip命令也打不开。请用过ICSharpCode.SharpZipLib.dll的朋友帮忙看看呢?或发段有用的代码学习一下。谢谢
C# code

      public void ZipFile(string strFile, string strZip)

    {

        if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar)

            strFile += Path.DirectorySeparatorChar;

        ZipOutputStream s = new ZipOutputStream(File.Create(strZip));

        s.SetLevel(6); // 0 - store only to 9 - means best compression

        zip(strFile, s, strFile);

        s.Finish();

        s.Close();

    }

      private void zip(string strFile, ZipOutputStream s, string staticFile)
      {

          if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar) strFile += Path.DirectorySeparatorChar;

          Crc32 crc = new Crc32();

          string[] filenames = Directory.GetFileSystemEntries(strFile);

          foreach (string file in filenames)
          {

              if (Directory.Exists(file))
              {

                  zip(file, s, staticFile);

              }

              else // 否则直接压缩文件
              {

                  //打开压缩文件

                  FileStream fs = File.OpenRead(file);

                  byte[] buffer = new byte[fs.Length];

                  fs.Read(buffer, 0, buffer.Length);

                  string tempfile = file.Substring(staticFile.LastIndexOf("\\") + 1);

                  ZipEntry entry = new ZipEntry(tempfile);

                  entry.DateTime = DateTime.Now;

                  entry.Size = fs.Length;

                  fs.Close();

                  crc.Reset();

                  crc.Update(buffer);

                  entry.Crc = crc.Value;

                  s.PutNextEntry(entry);

                  s.Write(buffer, 0, buffer.Length);

              }

          }
      }




        private void button1_Click(object sender, EventArgs e)
        {
         string[] FileProperties = new string[2];

        FileProperties[0] = "F:\\a\\";//待压缩文件目录

        FileProperties[1] = "f:\\a.zip";  //压缩后的目标文件

        ZipFile(FileProperties[0], FileProperties[1]);

        }





------解决方案--------------------
压缩文件内的 路径分隔符 你用的不对吧, '\' 还是 '/' 倒腾着试试。
------解决方案--------------------
ZipEntry 有这个函数, 注释中有说这个事情,

/// <summary>
/// Cleans a name making it conform to Zip file conventions.
/// Devices names ('c:\') and UNC share names ('\\server\share') are removed
/// and forward slashes ('\') are converted to back slashes ('/').
/// </summary>
/// <param name="name">Name to clean</param>
/// <param name="relativePath">Make names relative if true or absolute if false</param>
static public string CleanName(string name, bool relativePath)