首先,應用icsharpcode.sharpziplib.dll,這是個開源軟體,網路上可以下到原始碼。
注意,這個開源軟體的084版本或以上提供乙個方法直接壓縮與解壓資料夾。方法很簡單,只要如下幾行程式碼就可以了:
private void button3_click(object sender, system.eventargs e)
但是,這樣做就喪失了靈活性,據實測,壓縮的檔案好像比自己寫要稍微大一些,估計是沒有辦法指定壓縮等級的原因;而且,我看了下原始碼,好像也沒有看到crc校驗。
要改進以上不足,我們可以自己寫兩個類,來分別完成壓縮與解壓,程式碼如下:
壓縮類:
using system;
using system.io;
using icsharpcode.sharpziplib.checksums;
using icsharpcode.sharpziplib.zip;
using icsharpcode.sharpziplib.gzip;
namespace iistest.compression
system.io.filestream streamtozip = new system.io.filestream(filetozip,system.io.filemode.open , system.io.fileaccess.read);
system.io.filestream zipfile = system.io.file.create(zipedfile);
zipoutputstream zipstream = new zipoutputstream(zipfile);
zipentry zipentry = new zipentry("zippedfile");
zipstream.putnextentry(zipentry);
zipstream.setlevel(compressionlevel);
byte buffer = new byte[blocksize];
system.int32 size =streamtozip.read(buffer,0,buffer.length);
zipstream.write(buffer,0,size);
try
} catch(system.exception ex)
zipstream.finish();
zipstream.close();
streamtozip.close();
}private string addzip( string filename, string zipname,zipoutputstream s)
catch( exception addex )
}private void addfolder(string foldername,string zipname,zipoutputstream s)}}
public void zipfilemain(string args)
zipoutputstream s = new zipoutputstream(file.create(args[1]));
s.setlevel(6); // 0 - store only to 9 - means best compression
addfolder(args[0],args[0].substring(args[0].length-1)=="//"?args[0].substring(0,args[0].length-1).substring(args[0].substring(0,args[0].length-1).lastindexof("//")+1):args[0].substring(args[0].lastindexof("//")+1),s);
s.finish();
s.close();}}
}解壓類:
using system;
using system.text;
using system.collections;
using system.io;
using system.diagnostics;
using system.runtime.serialization.formatters.binary;
using system.data;
using icsharpcode.sharpziplib.bzip2;
using icsharpcode.sharpziplib.zip;
using icsharpcode.sharpziplib.zip.compression;
using icsharpcode.sharpziplib.zip.compression.streams;
using icsharpcode.sharpziplib.gzip;
namespace iistest.decompression
this.targetdirectory = args[1].tostring();
zipentry entry;
while ( (entry = s.getnextentry()) != null )
}finally
}private void extractentry(zipentry entry)
else
targetname = path.combine(targetdirectory, entryfilename);
dirname = path.getdirectoryname(path.getfullpath(targetname));
doextraction = doextraction && (entryfilename.length > 0);
}if ( doextraction && !directory.exists(dirname) )
catch }}
if ( doextraction && entry.isfile )
}private void extractfileentry(zipentry entry, string targetname)
int size;
do while (size > 0);
}finally
file.setlastwritetime(targetname, entry.datetime);}}
private void unzipfolder(string zipname,zipinputstream s)
else}}
private void unzipfile(string zipname,zipinputstream s)
else
}streamwriter.close();}}
}完成後,呼叫的過程如下:
private void button1_click(object sender, system.eventargs e)
private void button2_click(object sender, system.eventargs e)
這樣的靈活性就大多了,可以自己指定壓縮的等級等屬性。
上面我們引用的哪個dll全部是用c#寫成的,採用的壓縮方法好像是huffman編碼【沒怎麼詳細看】,只能壓縮成zip格式,中等壓縮和winrar壓縮成zip格式的檔案大小完全相等,壓縮速度比winrar壓縮成rar格式要快很多。壓縮後的zip檔案可以被rar解壓。
唯一的缺點就是不能壓縮成rar格式,當然了,也不能解壓rar檔案。
壓縮與解壓
linux下怎麼解字尾名是gzip的檔案?1.以.a為副檔名的檔案 tar xv file.a 2.以.z為副檔名的檔案 uncompress file.z 3.以.gz為副檔名的檔案 gunzip file.gz 4.以.bz2為副檔名的檔案 bunzip2 file.bz2 5.以.tar.z為...
壓縮與解壓
一 python壓縮解壓libs zlib infozip免費的壓縮lib。bzip2 讀寫bz壓縮檔案,與bzip2和bunzip2壓縮程式相容。gzip 讀寫gz壓縮檔案,與gnu壓縮程式gzip和gunzip相容。zipfile 讀寫zip壓縮檔案,與zip,unzip,pkzip,pkunz...
壓縮與解壓
1.基礎壓縮指令 gzip file 壓縮對應檔案,原始檔移除,如果是多個檔案壓縮,則被分別壓縮,不會打包。壓縮後檔名file.gz gunzip file.gz 解壓file.gz,壓縮包移除。bzip2 file k 同gzip,但是壓縮後的檔名file.bz2,k表示原始檔保留 bunzip2...