如果右键单击文件夹,您将看到“清洁”菜单项。我以为这将清理(删除)obj和bin目录。但是,据我所知,它什么也没做。还有另一种方法吗?(请不要告诉我去Windows资源管理器或cmd.exe)。我想删除obj和bin文件夹,以便我可以轻松地压缩整个内容。
Answers:
当其他人已经做出响应时,Clean将删除由构建生成的所有工件。但这会留下其他一切。
如果您在MSBuild项目中进行了一些自定义,这可能会带来麻烦,并留下一些您认为应该删除的内容。
您可以通过对。* proj进行简单更改来解决此问题,方法是在末尾添加以下内容:
<Target Name="SpicNSpan"
AfterTargets="Clean">
<RemoveDir Directories="$(OUTDIR)"/>
</Target>
这将删除当前平台/配置的bin文件夹中的所有内容。
------根据以下萨满的答案编辑轻微进化(分享投票并给他一些)
<Target Name="SpicNSpan" AfterTargets="Clean">
<!-- Remove obj folder -->
<RemoveDir Directories="$(BaseIntermediateOutputPath)" />
<!-- Remove bin folder -->
<RemoveDir Directories="$(BaseOutputPath)" />
</Target>
----使用xDisruptor中的零件再次进行编辑,但是我删除了.vs删除,因为最好在.gitignore(或等效文件)中使用
已针对VS 2015更新。
<Target Name="SpicNSpan" AfterTargets="Clean"> <!-- common vars https://msdn.microsoft.com/en-us/library/c02as0cs.aspx?f=255&MSPPError=-2147217396 -->
<RemoveDir Directories="$(TargetDir)" /> <!-- bin -->
<RemoveDir Directories="$(ProjectDir)$(BaseIntermediateOutputPath)" /> <!-- obj -->
</Target>
如果您有多个项目要执行,他还为使任务更易于部署和维护提供了很好的建议。
如果您对此答案进行投票,请务必同时对它们进行投票。
如果您使用的是git且.gitignore
项目中有正确的名称,则可以
git clean -xdf --dry-run
绝对删除.gitignore
列表中的每个文件,即它将清理obj
和bin
文件夹(x
触发此行为)
--dry-run
,这只会告诉您要删除的内容。不错
对于Visual Studio 2015,MSBuild变量有所更改:
<Target Name="SpicNSpan" AfterTargets="Clean"> <!-- common vars https://msdn.microsoft.com/en-us/library/c02as0cs.aspx?f=255&MSPPError=-2147217396 -->
<RemoveDir Directories="$(TargetDir)" /> <!-- bin -->
<RemoveDir Directories="$(SolutionDir).vs" /> <!-- .vs -->
<RemoveDir Directories="$(ProjectDir)$(BaseIntermediateOutputPath)" /> <!-- obj -->
</Target>
请注意,此代码段还会从解决方案的根目录中删除.vs文件夹。如果您觉得删除.vs文件夹是过大的事情,则可能需要注释掉关联的行。之所以启用它,是因为我注意到在某些第三方项目中,当.vs文件夹中存在ala application.config文件时,它会引起问题。
附录:
如果您要优化解决方案的可维护性,则可能需要更进一步,将上述代码片段放入一个单独的文件中,如下所示:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="SpicNSpan" AfterTargets="Clean"> <!-- common vars https://msdn.microsoft.com/en-us/library/c02as0cs.aspx?f=255&MSPPError=-2147217396 -->
<RemoveDir Directories="$(TargetDir)" /> <!-- bin -->
<RemoveDir Directories="$(SolutionDir).vs" /> <!-- .vs -->
<RemoveDir Directories="$(ProjectDir)$(BaseIntermediateOutputPath)" /> <!-- obj -->
</Target>
</Project>
然后在每个* .csproj文件的末尾都包含此文件,如下所示:
[...]
<Import Project="..\..\Tools\ExtraCleanup.targets"/>
</Project>
这样,您就可以在一个地方集中地集中或微调额外的清理逻辑,而不必每次手动进行改进时都手动手工编辑每个* .csproj文件。
要在构建之前删除bin和obj,请添加到项目文件中:
<Target Name="BeforeBuild">
<!-- Remove obj folder -->
<RemoveDir Directories="$(BaseIntermediateOutputPath)" />
<!-- Remove bin folder -->
<RemoveDir Directories="$(BaseOutputPath)" />
</Target>
该站点:https : //sachabarbs.wordpress.com/2014/10/24/powershell-to-clean-visual-studio-binobj-folders/使用William Kempf的powershell命令从当前目录中删除所有bin和obj文件夹子目录。应该可以从驱动器的根目录运行它。
这是威廉的版本
gci -inc bin,obj -rec | rm -rec -force
用威廉自己的话说:
这会清除当前目录和每个子目录中的所有“ bin”和“ obj”目录。在工作区目录中运行以进入“清理”状态非常有用,尤其是当有人搞砸并且IDE内的清理或重建无法捕获某些内容时。
对于您可能不知道的那些人,PowerShell支持命令别名,此处不再使用别名将其重写
Get-ChildItem -inc bin,obj -rec | Remove-Item -rec -force
注意:您应该将此文件存储在PowerShell文件中,然后将该文件放置在解决方案的根目录(.sln文件所在的目录)中,然后在需要进行适当清洁(而不是VisualStudio所用的米老鼠)时运行它,并报告成功)。
查看Ron Jacobs出色的开源CleanProject,如果您愿意,它甚至可以处理拉链。
这是CodePlex 链接
它不会删除文件夹,但是会删除生成副产品。您是否有任何理由要删除实际的构建文件夹?
Clean将删除由构建过程创建的所有中间文件和最终文件,例如.obj文件和.exe或.dll文件。
但是,它不会删除构建这些文件的目录。我没有令人信服的理由说明为什么需要删除目录。您能进一步解释吗?
如果在“清理”之前和之后查看这些目录,则应该看到已编译的输出已清理。
我还不能添加评论(没有达到最低声誉),
所以我在此回复中强调以下内容:
“ BeforeBuild”操作 <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
很棒,但对我来说,它与同一项目中包含的实体框架模型冲突。
我收到的错误是:
Error reading resource '{mymodel}.csdl' -- 'Could not find a part of the path '{myprojectpath}\obj\Release\edmxResourcesToEmbed\{mymodel}.csdl
我想,“ edmxResourcesToembed”是在执行“ BeforeBuild”目标操作之前创建的。
基于Joe的回答,我已经将VB代码转换为C#:
/// <summary>
/// Based on code of VSProjCleaner tool (C) 2005 Francesco Balena, Code Archirects
/// </summary>
static class VisualStudioCleaner
{
public static void Process(string rootDir)
{
// Read all the folder names in the specified directory tree
string[] dirNames = Directory.GetDirectories(rootDir, "*.*", SearchOption.AllDirectories);
List<string> errorsList = new List<string>();
// delete any .suo and csproj.user file
foreach (string dir in dirNames) {
var files = new List<string>();
files.AddRange(Directory.GetFiles(dir, "*.suo"));
files.AddRange(Directory.GetFiles(dir, "*.user"));
foreach (string fileName in files) {
try {
Console.Write("Deleting {0} ...", fileName);
File.Delete(fileName);
Console.WriteLine("DONE");
} catch (Exception ex) {
Console.WriteLine();
Console.WriteLine(" ERROR: {0}", ex.Message);
errorsList.Add(fileName + ": " + ex.Message);
}
}
}
// Delete all the BIN and OBJ subdirectories
foreach (string dir in dirNames) {
string dirName = Path.GetFileName(dir).ToLower();
if (dirName == "bin" || dirName == "obj") {
try {
Console.Write("Deleting {0} ...", dir);
Directory.Delete(dir, true);
Console.WriteLine("DONE");
} catch (Exception ex) {
Console.WriteLine();
Console.WriteLine(" ERROR: {0}", ex.Message);
errorsList.Add(dir + ": " + ex.Message);
}
}
}
Console.WriteLine(new string('-', 60));
if (errorsList.Count == 0) {
Console.WriteLine("All directories and files were removed successfully");
} else {
Console.WriteLine("{0} directories or directories couldn't be removed", errorsList.Count);
Console.WriteLine(new string('-', 60));
foreach (string msg in errorsList) {
Console.WriteLine(msg);
}
}
}
}
我使用VisualStudioClean,它易于理解且可预测。知道它是如何工作的以及它将要删除哪些文件使我感到欣慰。
以前我尝试过VSClean(注意VisualStudioClean不是VSClean),VSClean更高级,它具有许多配置,有时使我想知道要删除哪些文件?一种错误的配置将导致我的源代码丢失。测试配置的工作方式需要备份我的所有项目,这需要花费很多时间,因此最终我选择VisualStudioClean。
结论:VisualStudioClean如果要基本清洁,VSClean适用于更复杂的情况。
这是我处理批处理文件以递归方式删除所有BIN和OBJ文件夹的方式。
@echo off
@echo Deleting all BIN and OBJ folders...
for /d /r . %%d in (bin,obj) do @if exist "%%d" rd /s/q "%%d"
@echo BIN and OBJ folders successfully deleted :) Close the window.
pause > nul
如果有人没有意识到将整个过程自动化到zip归档文件在VB / C#中是多么容易,那么上述只是所有最佳答案的附录。
因此,您只需从模板中获取一个简单的Forms应用程序(如果您还没有家务应用程序),然后向其添加一个按钮,然后ClickOnce将其安装到桌面即可,而无需担心特殊设置或任何其他事情。这是您需要附加到按钮的所有代码:
Imports System.IO.Compression
Private Sub btnArchive_Click(sender As Object, e As EventArgs) Handles btnArchive.Click
Dim src As String = "C:\Project"
Dim dest As String = Path.Combine("D:\Archive", "Stub" & Now.ToString("yyyyMMddHHmmss") & ".zip")
If IsProjectOpen() Then 'You don't want Visual Studio holding a lock on anything while you're deleting folders
MsgBox("Close projects first, (expletive deleted)", vbOKOnly)
Exit Sub
End If
If MsgBox("Are you sure you want to delete bin and obj folders?", vbOKCancel) = DialogResult.Cancel Then Exit Sub
If ClearBinAndObj(src) Then ZipFile.CreateFromDirectory(src, dest)
End Sub
Public Function ClearBinAndObj(targetDir As String) As Boolean
Dim dirstodelete As New List(Of String)
For Each d As String In My.Computer.FileSystem.GetDirectories(targetDir, FileIO.SearchOption.SearchAllSubDirectories, "bin")
dirstodelete.Add(d)
Next
For Each d As String In My.Computer.FileSystem.GetDirectories(targetDir, FileIO.SearchOption.SearchAllSubDirectories, "obj")
dirstodelete.Add(d)
Next
For Each d In dirstodelete
Try
Directory.Delete(d, True)
Catch ex As Exception
If MsgBox("Error: " & ex.Message & " - OK to continue?", vbOKCancel) = MsgBoxResult.Cancel Then Return False
End Try
Next
Return True
End Function
Public Function IsProjectOpen()
For Each clsProcess As Process In Process.GetProcesses()
If clsProcess.ProcessName.Equals("devenv") Then Return True
Next
Return False
End Function
要记住的一件事是文件系统删除很容易出错。我的最爱之一是当我意识到无法删除文件夹,因为该文件夹包含以提升权限运行的Visual Studio创建的项目(以便调试服务)。
我需要手动授予权限,或者,我想也应该以提升的特权运行该应用程序。无论哪种方式,我认为在脚本上使用基于GUI的交互式方法都具有一定的价值,特别是因为这很可能是在漫长的一天结束时完成的,并且您不希望以后再发现备份实际上不存在...
更新:Visual Studio 2019(在发布之前清除[bin]和[obj])。但是我不确定[obj]是否需要删除。请注意,也放置了nuget软件包配置。如果您认为这样,可以删除第二行。
<Target Name="PreBuild" BeforeTargets="PreBuildEvent" Condition="'$(Configuration)' == 'Release'">
<!--remove bin-->
<Exec Command="rd /s /q "$(ProjectDir)$(BaseOutputPath)" && ^" />
<!--remove obj-->
<Exec Command="rd /s /q "$(BaseIntermediateOutputPath)Release"" />
</Target>