首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有任何外部依赖项的MSBuild压缩目录任务(没有MSBuildCommunityTasks)

没有任何外部依赖项的MSBuild压缩目录任务(没有MSBuildCommunityTasks)
EN

Stack Overflow用户
提问于 2014-08-12 11:02:56
回答 2查看 1.2K关注 0票数 1

我试图找到一种不用使用MSBuild而使用MSBuildCommunityTasks来压缩构建的方法。我确实在网上找到了一些代码,但是它似乎把所有的文件,甚至是目录中的文件放在一个文件中(没有目录)。

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<UsingTask TaskName="Zip" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
  <InputFileNames ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
  <OutputFileName ParameterType="System.String" Required="true" />
  <OverwriteExistingFile ParameterType="System.Boolean" Required="false" />
</ParameterGroup>
<Task>
  <Reference Include="System.IO.Compression" />
  <Using Namespace="System.IO.Compression" />
  <Code Type="Fragment" Language="cs">
  <![CDATA[ 
    const int BufferSize = 64 * 1024;

    var buffer = new byte[BufferSize];
    var fileMode = OverwriteExistingFile ? FileMode.Create : FileMode.CreateNew;

    using (var outputFileStream = new FileStream(OutputFileName, fileMode))
    {
      using (var archive = new ZipArchive(outputFileStream, ZipArchiveMode.Create))
      {
        foreach (var inputFileName in InputFileNames.Select(f => f.ItemSpec))
        {
          var archiveEntry = archive.CreateEntry(Path.GetFileName(inputFileName));

          using (var fs = new FileStream(inputFileName, FileMode.Open))
          {
            using (var zipStream = archiveEntry.Open())
            {
              int bytesRead = -1;
              while ((bytesRead = fs.Read(buffer, 0, BufferSize)) > 0)
              {
                zipStream.Write(buffer, 0, bytesRead);
              }
            }
          }
        }
      }
    }        
  ]]>
  </Code>
</Task>
</UsingTask>
</Project>

我如何才能获得这个代码来压缩我的文件夹并保持目录完整?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-13 11:34:44

代码语言:javascript
复制
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <UsingTask TaskName="Zip" TaskFactory="CodeTaskFactory" AssemblyName="Microsoft.Build.Tasks.v12.0">
    <ParameterGroup>
      <Directory ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
      <Reference Include="System.IO.Compression.FileSystem" />
      <Code>System.IO.Compression.ZipFile.CreateFromDirectory(Directory, Directory + ".zip");</Code>
    </Task>
  </UsingTask>

  <Target Name="Foo">
    <Zip Directory="C:\Users\Ilya.Kozhevnikov\Dropbox\Foo" />
  </Target>
</Project>
票数 6
EN

Stack Overflow用户

发布于 2014-08-13 00:25:54

对于存档中的文件目录和目录,您可以做很多事情。作为一个简化的假设,让我们选择一个基本目录并要求所有文件都在它下面。在归档文件中,条目将是文件路径的一部分,直到但不包括基本目录名。

因此,添加一个参数:

代码语言:javascript
复制
<BaseDirectory ParameterType="System.String" Required="true" />

更改条目的归档路径:

代码语言:javascript
复制
var archiveEntry = archive.CreateEntry(
    new Uri(Path.GetFullPath(BaseDirectory) + path.DirectorySeparatorChar)
        .MakeRelativeUri(new Uri(Path.GetFullPath(inputFileName))).ToString());

而且,作为奖励,修正了过于严格的文件访问共享:

代码语言:javascript
复制
using (var fs = new FileStream(inputFileName, FileMode.Open, FileAccess.Read, FileShare.Read))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25262635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档