我使用SharpZipLib.dll中遇到的問題是:利用SharpZipLib壓縮後產生的*.rar檔案,利用其可以正常解壓,但如果使用檔案右擊壓縮產生的*.RAR檔案,在解壓過程中出錯,具體報錯資訊:Wrong Local header signature: 0x21726152 ;但*.zip檔案可正常解壓。
具體壓縮、解壓代碼實現參照網路上的代碼,貼出概要代碼:
複製代碼 代碼如下:/// <summary>
/// 壓縮檔
/// </summary>
/// <param name="sourceFilePath">源檔案路徑</param>
/// <param name="destinationPath">壓縮檔後的儲存路徑</param>
/// <returns>壓縮是否成功</returns>
public bool Compress(string sourceFilePath, string destinationPath)
{
try
{
string[] filenames = Directory.GetFiles(sourceFilePath);
using (ZipOutputStream zs = new ZipOutputStream(File.Create(destinationPath)))
{
zs.SetLevel(9);
byte[] buffer = new byte[4096];
foreach (string file in filenames)
{
ZipEntry entry = new ZipEntry(Path.GetFileName(file));
entry.DateTime = DateTime.Now;
zs.PutNextEntry(entry);
using (FileStream fs = File.OpenRead(file))
{
int sourceBytes;
do
{
sourceBytes = fs.Read(buffer, 0, buffer.Length);
zs.Write(buffer, 0, sourceBytes);
}
while (sourceBytes > 0);
}
}
zs.Finish();
zs.Flush();
zs.Close();
}
}
catch (Exception)
{
return false;
}
return true;
} public bool DeCompress(string sourceFilePath, string destinationPath)
{
try
{
using (ZipInputStream zs = new ZipInputStream(File.OpenRead(sourceFilePath)))
{
ZipEntry entry = null;
//解壓縮*.rar檔案運行至此處出錯:Wrong Local header signature: 0x21726152,解壓*.zip檔案不出錯
while ((entry = zs.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(entry.Name);
string fileName = Path.GetFileName(entry.Name);
if (!string.IsNullOrEmpty(fileName))
{
using (FileStream streamWriter = File.Create(destinationPath + entry.Name))
{
int size = 2048;
byte[] data = new byte[size];
while (true)
{
size = zs.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
}
}
}
}
}
catch (System.Exception)
{
return false;
}
return true;
}
如果需解壓*.rar的壓縮檔在網路也可以找到相關的實現代碼,概要代碼: 複製代碼 代碼如下:public bool DeCompressRAR(string sourceFilePath, string destinationPath)
{
try
{
string SeverDir = @"D:\Program Files\WinRAR";//rar.exe的要目錄
Process ProcessDecompression = new Process();
ProcessDecompression.StartInfo.FileName = SeverDir + "\\rar.exe";
Directory.CreateDirectory(sourceFilePath);
ProcessDecompression.StartInfo.Arguments = " X " + sourceFilePath + " " + destinationPath;
ProcessDecompression.Start();
while (!ProcessDecompression.HasExited)
{
//nothing to do here.
}
return true;
}
catch (System.Exception)
{
return false;
}
}
我本想利用FileUpload控制項將上傳的壓縮檔解壓後儲存至相對應的目錄並更新資料庫檔案目錄,後發現一些較好的用於上傳的開源軟體:如NeatUpload,SWFUpload可以較方便的實現我的需求,遂沒有過多糾纏於SharpZipLib,可能關於SharpZipLib的壓縮與解壓有其它用法,不能被我誤導,以上代碼是從網路上整合出來的,因為它太過於重複和散亂。