不過,有些人做事比較馬虎,經常就是直接將VS產生的解決方案目錄直接打包,這樣就會包含大量垃圾檔案,諸如:obj目錄下的所有檔案,而且有時bin目錄還有二個目錄,PDB檔案有二份,甚至連xxx.vshost.exe檔案也有二份!更讓人無語的是,有些人用SVN這種原始程式碼控制軟體,每個目錄還有個.svn目錄!
這種做法顯然很容易將一個不大的項目搞成一個比較大的壓縮包,這種壓縮包一旦做好,上傳也慢,人家下載也慢,還會浪費許多伺服器資源,下載到這種壓縮包,只能讓人無語了。沒辦法,有些人就是很懶,而且那些壓縮軟體也不懂這是個原始碼目錄,反正是見檔案就壓縮!雖然很悲劇,但悲劇卻一直在重複上演!現實就是這樣,估計有些人已經麻木了!
我是個追求完美的人,自然是不希望讓悲劇在我這裡重複上演。我不希望浪費我的上傳時間,不希望浪費伺服器的硬碟資源,不希望浪費伺服器的頻寬,也不希望浪費所有網友的下載時間,更不希望有人會因此而罵我。因此我每次做出來的壓縮包是不包含那些垃圾檔案的。我是如何做的呢?很簡單啊,不要把一些垃圾檔案打包進去不就好了嗎?還要怎樣?
不過,我也很理解一些懶人,每次打包前去把這些檔案找出來,刪除它們,也是有些麻煩。當然了,我也不願意每次都做這種機械的事情,我也想偷懶。
嗯,既然打包前刪除這些垃圾檔案是件機械的事情,那麼能不能搞個程式去做呢,我是程式員啊。
終於有一天,我也受不了了,尤其是我平時喜歡寫點小東西,每天改了之後要備份,也要用壓縮包,但我不想浪費硬碟空間啊。在一次一次地被那些壓縮軟體折磨後,我還是選擇自己來設計一個工具來專門解決這個問題。不就是個壓縮的事情不好解決嘛,那我就自己做吧,反正現在的壓縮類庫是一大把,不過,我最終還是選擇了Windows內建的FCI/FDI介面,它能直接產生cab格式的壓縮包,且現在流行的各種壓縮軟體都能支援它。選擇它還有其它原因:1.我早在使用C#之前就已經使用過它了,有現成的封裝庫(C語言版的,速度還不錯),2.由於是Windows內建的介面,因此不需要引入額外的組件,工具可以保持較小的體積, 3.cab演算法的壓縮率還不錯,比zip要好(與rar相當,比7z差點)。
今天,我將向大家推薦一個我幾乎天天在用的工具。它能很完美的解決以上問題,它還有其它功能,我也非常喜歡它。下面,我就來介紹此工具。
記住哦,這個工具的名字叫:FishCabTool
工具介紹
來看看我的工具吧,總共由4個檔案組成:
![]()
雖然是4個檔案,但依然很小,離300K還有些距離哦。下面來依次介紹這4個檔案的用途:
1. FishCabToolHelp.chm,它是一個協助檔案,介紹了工具的特色功能,操作方式,以及其它說明:
![]()
2. FishCabTool.exe,它是這個工具的主程式了,是一個WinForm程式,運行介面如下:
![]()
通常,並不需要直接運行它,而是從資源管理員的操作功能表中啟動它,操作方式與現今流行的壓縮軟體一樣,如下圖。
3. FishCabToolExt.dll,它是一個Windows資源管理員的外掛程式,可以讓我的工具也能像一些壓縮軟體一樣,直接在Windows資源管理員的右鍵菜單中操作,如下圖:
為了不影響操作體驗,這個外掛程式採用ATL的方式實現,因此速度還是很不錯的。說到速度,再給個具體的資料吧:當年在開發這個工具時,是在一台(02年的)老機器上進行的,由於機器配置較差,所以效能相當敏感。測試時我選擇Windows/System32檔案夾下的所有檔案,右擊滑鼠並測量菜單出現的時間,WinRar V2.6花了27秒,7z V4.x花了差不多8秒,我的工具還不到3秒。所以,不要擔心這個外掛程式的會影響您的機器效能。
說明:FishCabToolExt.dll採用Unicode方式編寫,所以理論上即使不是簡體中文的Windows下也能正常顯示漢字。
4. FishCabLibU.dll,它是一個封裝層,用於封裝Windows的FCI/FDI介面,因為這二個介面是基於C的,且介面較為複雜,我也只好用C來封裝了,並以標準的匯出函數提供給其它程式設計語言調用。匯出的API函數如下圖:
![]()
在寫這篇部落格時,看到當年給這些API取的名字,我也鬱悶了:這些名字也太亂了吧。哎,2004年咱的命名規範還真差勁啊。
FCI/FDI是Windows的檔案壓縮介面/檔案解壓縮介面的簡稱。它提供了操作CAB壓縮包的具體實現演算法,該介面涉及一大堆C風格的回呼函數。
微軟提供的關於此介面的SDK文檔:點擊此處下載(微軟的網站上找不到了,遺憾中)
我封裝的介面是一種簡化版本,各個API函數已經是簡單的資料類型,因此使用起來會比較容易,且提供Unicode和非Unicode二套API,如果您也對cab格式感興趣,並希望使用我的FishCabLibU.dll,請回複,我可以提供C#版本的封裝類。
功能介紹
正如本文前面的協助檔案截圖所示,這個小工具有以下功能:
1. 專為備份原始碼而設計,可以選擇性地排除原始碼目錄中一些不需要備份的檔案。
如:obj目錄及.pdb和其它原始碼版本控制資訊之類的“垃圾”檔案。
具體哪些檔案不需要在壓縮時加入壓縮包,程式提供如下的設定介面來控制
![]()
2. 操作方式和現今流行的壓縮軟體一致,直接在資源管理員的右鍵菜單中操作。
前面在介紹FishCabToolExt.dll時已有說明,這裡再次引用那二張圖片:
3. 產生的壓縮包採用cab的壓縮格式,相容現今流行的各類壓縮軟體。
cab格式其實早就存在了,至少也有15年以上曆史。此檔案格式由微軟開發,且在微軟的很多安裝包中都在使用這種格式。由於曆史悠久,且檔案格式公開,因此現今流行的各類壓縮軟體都支援它。
注意:WinRar對cab的支援不夠好,如果cab採用UTF-8編碼方式建立包內檔案名稱,在WinRar中將會看到亂碼。而7z就沒有問題,當然了,我的工具也能正確地解包。
4. 壓縮包的檔案名稱包含當天的操作日期,便於版本管理及日後尋找。
前面說到我平時喜歡在業餘時間寫點小工具或者小項目,自然就會面對原始碼的版本管理問題。但我卻不想為此而安裝一個龐大的原始程式碼控制軟體,感覺完全沒有必要。通常就是直接把項目目錄打包,然後在檔案名稱上添加當天日期。正是由於這個原因,這個工具會自動根據目錄名稱以及當天日期,產生一個合適的壓縮包檔案名稱。可以參見前面程式的主介面截圖。說明:按F12可以去掉檔案名稱中的日期部分。
5. 更靈活的備份選擇,可以將多個目錄及多個分區中的某些目錄或檔案壓縮到一個壓縮包中。
我的工具還可以將來自於不同磁碟分割的檔案打包在一個壓縮檔中。操作方法也很簡單:直接將需要壓縮的檔案或者檔案夾拖動主視窗中即可,如下圖:
![]()
程式產生的壓縮包用7z開啟的介面如下:
![]()
6. 可以方便地擷取一個目錄或檔案的完整路徑名。
FishCabToolExt.dll中還有一個我經常用到的功能就是:當您在右擊一個檔案或者檔案夾時,可以非常方便地擷取它的所在全路徑。效果圖前面有,請參考前文。
7. 可以方便地從任何目錄開啟命令列視窗。
我比較喜歡用Windows Server 2003,可是每當以命令列方式執行一些任務時,都要開啟【運行】視窗,輸入【cmd】後,再切換路徑,太麻煩了。 FishCabToolExt.dll中有個功能就可以很輕鬆地解決這個繁瑣的過程。您只需要在Windows資源管理員中右擊目錄,或者在目錄視窗的空白處右擊滑鼠,點擊菜單【從這裡開啟命令列視窗】就可以了,此時,您會發現,命令列視窗的目前的目錄就是您需要的目錄。效果圖前面有,請參考前文。
壓縮效果
為了證明我的工具對於原始碼目錄壓縮的效果是有明顯改善的,現在我來將我的工具與7-Zip做個比較 。
首先,我要說明一下,7-Zip是目前全球最棒的壓縮軟體,它有著最高的壓縮率。
但它唯一遺憾的是就是 不能自動在壓縮時過濾不必要的垃圾檔案(相對於原始碼來說),因此最終產生的壓縮包並不是最小的。
首先,我開啟VS2008,建立一個ConsoleApplication,然後不修改任何設定,並寫了如下代碼:
複製代碼 代碼如下:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello Fish.");
}
}
}
再來編譯吧,我將這個項目按debug, release方式都編譯了一次。
然後,我請出我安裝的7-Zip V9.2把這個項目目錄做了個壓縮包。然後,我又用我的工具也做了個壓縮包。二個包的大小如下:
![]()
有圖有真相,我就不多解釋了。
補充說明
預設的參數是按照C#項目及SVN版本控制軟體而設定的,如有其它的備份要求,請重新設定參數。
預設的參數並沒有採用最好的壓縮品質,如果你需要較高的壓縮品質,那麼請自行調整。
運行本程式需要 .net Frarmework 2.0
由於FishCabToolExt.dll是個ATL COM,由32位的VC++6編譯器編譯,因此這個外掛程式只能在32位的Windows中運行。
不過,FishCabTool.exe是個採用C#編寫的WinForm程式,且要求以32位方式運行,因此如果在64位的Windows中,那麼只能從開始菜單中啟用本程式。
此時,程式仍能正常運行,只是不能從資源管理員的右鍵菜單中啟動。
如何乾淨的卸載本工具
我寫的是一個我認為有用的小工具,而非流氓軟體。如果您認為它沒有任何優點,請按如下方法卸載它。
由於FishCabToolExt.dll是個Windows資源管理員的外掛程式,它一旦被載入,就不能立即卸載了。具體方法請參考下文:
FishCabTool的安裝程式可以非常乾淨地將FishCabTool從你的電腦上刪除(包括所有檔案及登錄機碼)。
如需卸載,請關閉全部資源管理員視窗(建議登出後重新登入),然後直接開啟“控制台”中的“添加或刪除程式”,選擇刪除FishCabTool即可。
注意:由於FishCabTool有一部分作為資源管理員的外掛程式會被自動載入,所以在卸載時一定要保證關閉全部資源管理員視窗(包括案頭進程)。
上傳代碼到部落格園
由於部落格園的後台操作介面只支援三種格式的壓縮包:zip, rar, 7z ,所以如果您打算用這個工具打包您的代碼並上傳到部落格園時,請修改檔案名稱,在後面加上 .7z
例如:我的部落格【用戶端的非同步作業】就提供一些範例程式碼,我用工具打包後,產生的檔案名稱是【AsyncClient_20111023.cab】,然後我將檔案名稱修改為【AsyncClient_20111023.cab.7z】,就可以上傳了。
可以放心的是:7-Zip 是可以識別這種改名後的檔案。
由於現在知道CAB格式的人越來越少,可能還有些網站也不能支援直接上傳,那麼可按這種方式修改一下副檔名。
在此,我發出一個倡議:從現在起,如果您要與他人分享您的範例程式碼,那麼請在打包時,不要包含不必要的垃圾檔案。
因為那些垃圾檔案會:浪費您的上傳時間,浪費伺服器的硬碟資源,浪費伺服器的頻寬,浪費所有網友的下載時間。
舉手之勞,利人利已。
說明:工具可免費使用,沒有著作權限制。
點擊此處下載安裝程式(2011-10-30更新)