2

我发现使用 MSBuild Community Tasks 提供的 Zip 任务创建 zip 文件会更改(或者更确切地说,删除)正在压缩的文件的任何文件属性。这是我对 Attrib 任务的调用之一,以使文件夹内的 DLL 具有只读属性:

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

接下来,我将这些 DLL 包含在 FilesToZip 项中,并调用了以下内容:

<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)

4

1 回答 1

1

好的,所以现在我将在这里回答我自己的问题,希望它对某人有用:

在 Zip 任务 (MSBuild.Community.Tasks.Zip) 的源代码中,私有方法 ZipFiles() 不会设置或查看任何外部属性(这是任务压缩的每个文件的文件属性)。由于我只需要保持具有只读属性的文件的属性不变,因此我编写了以下代码来满足我的简单目的:

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

这与我应该使用的通用且健壮的代码相去甚远,但我写了这篇文章是为了看看这是否是保留文件属性的正确方法,而且似乎确实如此。

PS如果有人对这里可以改进的地方提出建议,请分享您的想法!作为一个初出茅庐的开发者,我总是愿意接受教育 :)

于 2009-09-03T22:51:27.857 回答