将整个目录复制到输出文件夹,维护文件夹结构?
Posted
技术标签:
【中文标题】将整个目录复制到输出文件夹,维护文件夹结构?【英文标题】:Copy entire directory to output folder maintaining the folder structure? 【发布时间】:2013-07-18 12:49:15 【问题描述】:我希望在每次构建时将特定目录复制到输出文件夹(“bin”)。我认为它可以通过后期构建脚本来处理。但我不确定如何复制目录本身。我知道如何处理特定文件。
例如,这适用于文件:
在
项目>属性>构建事件>构建后
COPY "$(SolutionDir)Resources\Release Notes.pdf" "$(TargetDir)"
但是假设我有一个目录Template
,现在我需要Template
下的所有内容在成功构建后进入bin
文件夹维护文件夹结构。
我试过了:
COPY "$(SolutionDir)Resources\Template\" "$(TargetDir)"
只有Template
目录中的文件以这种方式被复制,而不是子目录和Template
文件夹中的文件。我希望文件夹 Template
本身进入我的输出 bin
文件夹中。换句话说,bin
应该是这样的:
bin > Template > abc.xxx
xxx.yyy
Subdirectory1 > asd.qwe
zxc.qwe
Subdirectory2 > ...
这可能是重复的,但我找不到相关的线程。谢谢。
【问题讨论】:
【参考方案1】:我刚刚将它添加到我的 *.csproj 文件中(右键单击编辑项目文件)
<ItemGroup>
<Content Include="MYCUSTOMFOLDER\**">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
我认为为此目录需要与 *.csproj 文件位于同一层次结构级别或以下。
【讨论】:
这确实有效。 A/ 很遗憾,这在 VS 解决方案资源管理器中是不可能的,而是“破解”了 csporj 文件。 B/ 当你有大量的测试数据时,它不仅会减慢构建速度,还会浪费整个磁盘空间负载 这对我有用,我只需要更改 xml 上的构建操作。构建操作是 ItemGroup 本身的元素。所以我将“内容”更改为“无”。这使得 Include 属性上的所有项目都具有构建操作“无” 为我工作,但为什么在 VS 2019 上它会在解决方案资源管理器中显示每个文件两次?好像对我没有影响。我是否必须删除每个子文件夹包含一行的另一个 ItemGroup 以及 VS 自动在 csproj 文件中创建的所有文件? 已经使用了这个解决方案和 XCOPY,这是更好的加载。 很棒的提示。并同意 - 为什么 MS 不将其作为简单的解决方案资源管理器功能包含在内?【参考方案2】:这对我有用。 /S
是递归复制所有内容的密钥。
XCOPY "$(SolutionDir)Resources\Template" "$(TargetDir)\Template\" /S
因为我希望每次都在没有提示的情况下覆盖文件,所以我还添加了一个 /Y
开关。
XCOPY "$(SolutionDir)Resources\Template" "$(TargetDir)\Template\" /S /Y
【讨论】:
/S 将忽略空文件夹。要复制所有内容,包括空文件夹,请改用 /E。 有没有办法在不使用命令行的情况下做到这一点。我知道您可以右键单击每个单独的文件并在属性中说“复制到输出目录”。但这相当麻烦,但透明且不易出错(由于拼写错误)。 @Shiroy 您可以尝试在 csproj 文件中批量编辑以设置“复制到输出目录”【参考方案3】:尝试 XCOPY 而不是 COPY;例如
XCOPY "$(SolutionDir)Resources\Template\" "$(TargetDir)\Template" /s /i /y
在此处了解有关 XCOPY 的更多信息...
http://www.computerhope.com/xcopyhlp.htm
【讨论】:
+1 给了我正确的方向。但我没有让你的解决方案奏效。我需要在第二个参数中指定目标目的地Template
。而且我不确定是否真的需要/I
。我没有编辑您的,而是将其作为单独的答案。
请注意,您可以使用 XCOPY "$(SolutionDir)..\Resources\Template" "$(TargetDir)" /S /I /Y 转到 SolutionDir 上方的一个目录【参考方案4】:
这是截至本文发布之日在 Visual Studio 2019 上运行的附加解决方案。这将递归地复制文件夹结构和其中的所有文件。在多项目解决方案中的 C++ .vcxproj 上进行了测试。
首先,首先编辑您的 [ .proj / .vcxproj / .csproj ] 文件。打开后,找到您的项目范围标签。如果您已经有 ItemGroups,则将下面的代码直接粘贴在现有代码之后。否则,将其添加到 PropertyGroup 标记之前。然后修改您希望复制到输出路径的文件夹结构的 Include & Link 参数。
<ItemGroup>
<Content Include="..\Assets\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<DeploymentContent>true</DeploymentContent>
<Link>Assets\%(RecursiveDir)\%(Filename)%(Extension)</Link>
</Content>
</ItemGroup>
注意:如果您有多个***文件夹,如 JS、IMG、BIN 等,请为每个文件夹创建一个新条目。
【讨论】:
【参考方案5】:我有这个问题的有效解决方案:
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<ItemGroup>
<CommonFont Include="..\common\src\Web\wwwroot\css\fonts\*.*" />
</ItemGroup>
<Copy SourceFiles="@(CommonFont)" DestinationFolder="wwwroot\css\fonts" SkipUnchangedFiles="true" />
</Target>
【讨论】:
【参考方案6】:CodingYourLife 的解决方案几乎对我有用,但我发现 PreserveNewest 没有得到尊重。我在 Visual Studio 论坛上找到了一个可以正常工作的 solution。我的 .CSPROJ 现在看起来像这样:
<Content Include="assets\**">
<Link>assets\%(RecursiveDir)\%(Filename)%(Extension)</Link>
<TargetPath>assets\%(RecursiveDir)\%(Filename)%(Extension)</TargetPath>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
注意:此解决方案需要 Visual Studio 16.10 或更高版本。
【讨论】:
以上是关于将整个目录复制到输出文件夹,维护文件夹结构?的主要内容,如果未能解决你的问题,请参考以下文章