2009-09-03 76 views
2

我發現使用MSBuild社區任務提供的Zip任務創建zip文件可以更改(或更確切地說,刪除)正在壓縮的文件的任何文件屬性。下面是我的ATTRIB任務做一個文件夾中的DLL調用一個都只讀屬性:MSBuild社區任務的Zip任務更改文件屬性

<Attrib ReadOnly="true" Normal="true" Files="@(DLLsToReadOnly)" /> 

在路上,我包括在FilesToZip項目這些DLL並呼籲如下:

<Zip Files="@(FilesToZip)" WorkingDirectory="$(Directory with files)" ZipFileName="$(DropLocation)\$(Zip file name).zip" /> 

檢查提取的文件後,我發現沒有任何DLL具有隻讀屬性(更少,任何)。查看Zip文件夾所在的DLL文件夾,顯示DLL具有屬性R(僅用於只讀)。

在閱讀了文檔和源代碼之後,我找不到任何可以設置的屬性來告訴任務保留文件屬性。有沒有替代品可以保持文件屬性的完整性?我曾嘗試將ICSharpCode.SharpZipLib作爲社區任務源中的Zip類引用它,但到目前爲止,我一直無法從中獲益。

(我用社區任務版本1.2.0.306)

回答

1

好了,現在我要在這裏回答我的問題,希望這將是有用的人:

在源代碼爲Zip任務(MSBuild.Community.Tasks.Zip),私有方法ZipFiles()不會設置或查看任何外部屬性(這是任務壓縮的每個文件的文件屬性)。因爲我只需要保持屬性不變爲具有隻讀屬性的文件,我寫了下面的代碼爲我的目的很簡單:

if ((file.Attributes & FileAttributes.ReadOnly) 
{ 
    entry.ExternalFileAttributes = (int)FileAttributes.ReadOnly; 
} 

這附近,我應該使用通用和健壯的代碼沒有什麼,但我寫這個看看這是否是保存文件屬性的正確方法,而且確實如此。

P.S.如果有人有什麼可以改進的建議,請分享您的想法!作爲一個初出茅廬的開發者,我總是願意接受教育:)