在unix下的我們怎麼會淪落到用ruby寫壓縮和解壓工具呢?直接上shell啊!但是請允許本貓這次可恥的用ruby來玩玩吧!

其實ruby gem中有很多壓縮解壓包,我選的是zip,也許是因為名字元合kiss原則吧!不過在編寫中發現zip中的某些類沒有文檔中所說明的執行個體方法,也許在某個平台上還未實作??
話先說到前頭,這個工具如果解壓有重名檔案的情況會直接覆寫原檔案而不會有任何提示!測試時務必注意,如果造成一些檔案丢失可别怪本貓啊!
代碼也考慮到多檔案的情況,如果是壓縮多檔案則預設會單獨壓縮每一個檔案,比如:zip.rb a b c d 會産生a.zip .. d.zip四個壓縮檔案;但是我也考慮到現實中的情況,單獨寫了一個zip_n2one方法将多個檔案壓縮到一個檔案中去,這個可以看代碼實作,很清楚;如果是解壓多檔案則會依次解壓縮每個檔案,如果檔案有重名會像之前說的直接覆寫。
代碼未考慮到如果多個壓縮檔案的basename相同的情況,即zip.rb a.dat ../a.dat ~/a.dat的情況。如果真是如此,我估計壓縮包中最終隻有一個entry檔案就是最後一個~/a.dat,要避免這種情況需要做額外的判斷,我這裡不是寫真正的生産工具,隻是個玩具嘛,是以點到為止了。
在測試代碼中發現一個問題:就是如何實作删除一個目錄下的所有檔案,但除了zip檔案。這個直接用shell吧:
apple@kissair: tmp$ls|grep -v .*.zip|xargs -n1 rm
如果是删除所有zip檔案呢?可以這樣:
apple@kissair: tmp$ls|grep .*.zip|xargs -n1 rm
不過傻了吧,為什麼不直接 rm *.zip呢?
下面上代碼,寫的比較快,是以有些實作略顯“笨拙”,該優化的沒優化,該重構的沒重構!最後再提醒下:如果要多個檔案打包在一個zip中請使用zip_n2one方法,注意zip_n2one方法的最終zip檔案名是寫死的,這也讓人稍感不快,但這終歸隻是測試,是以各位童鞋可以随時重寫哦: