如何在 VisualStudio 中完全清除 bin 和 obj 文件夹?

如果你右键点击一个文件夹,你会看到一个“清洁”菜单项。我假设这将清除(删除) obj 和 bin 目录。 然而,在我看来,它什么也没做。 还有别的办法吗? (请不要告诉我去文件资源管理器或 cmd.exe) 我想删除 obj 和 bin 文件夹,以便我可以轻松地压缩整个事情。

143334 次浏览

Clean 将删除生成过程创建的所有中间文件和最终文件,例如。Obj 文件和。前任或者。Dll 文件。

但是,它不会删除生成这些文件的目录。 我没有看到一个令人信服的理由,为什么你需要删除目录。 你能进一步解释吗?

如果在“清理”之前和之后查看这些目录,您应该会看到已编译的输出被清理干净。

看看 Ron Jacobs 的开源程序 清洁计划,如果你喜欢的话,它甚至可以负责压缩。

这是 CodePlex 链接

正如其他人已经响应的那样,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>

——用来自 干扰器的部分再次编辑,但是我删除了。与删除,因为这将更好地服务于一个。吉蒂诺尔(或等价物)

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

他还提供了一个很好的建议,如果您有多个项目来推进这个任务,那么可以更容易地部署和维护这个任务。

如果你投这个答案,一定要同时投他们两个。

在生成之前删除 bin 和 obj 添加到项目文件:

<Target Name="BeforeBuild">
<!-- Remove obj folder -->
<RemoveDir Directories="$(BaseIntermediateOutputPath)" />
<!-- Remove bin folder -->
<RemoveDir Directories="$(BaseOutputPath)" />
</Target>

这是一篇文章: 如何在构建或部署之前删除 bin 和/或 obj 文件夹

基于 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);
}
}
}
}

您可以在 Far Manager 中轻松地找到和删除 垃圾箱对不起文件夹。

  1. 导航到解决方案并按 Alt + F7
  2. 在搜索设置对话框中:

    • 在“一个文件掩码或多个文件掩码”字段中键入“ bin,obj”
    • 检查选项 “ Search for files”
    • 按回车键
  3. 搜索结束后,切换到“面板”视图

  4. 选择所有文件(使用 Ctrl + A)并删除文件夹(按“ Shift + Del”)

希望能帮到别人。

如果您正在使用 git 并且在您的项目中有一个正确的 .gitignore,那么您可以

git clean -xdf --dry-run

完全删除 .gitignore列表中的每个文件,即清除 objbin文件夹(x触发这种行为)


注意: 参数 --dry-run将只模拟操作(“将删除...”) ,并显示 git delete 的内容。尝试与干运行,然后删除参数,它将真正删除文件 + 文件夹。

可选地,在那个 clean 命令之后,您可以使用 dotnet restore mySolution.sln来恢复所有 NUGET 包。如果您打开了一个开发者控制台,< br/> 您可以在之后快速运行 msbuild -m mySolution.sln(不需要打开 Visual Studio)来查看它是否成功。

对于 VisualStudio2015,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 文件夹是一个过度杀伤。我之所以启用它,是因为我注意到在一些第三方项目中,当 ala application.config 文件存在于。VS 文件夹。

附录:

如果你想要优化解决方案的可维护性,你可能需要更进一步,把上面的代码片段放到一个单独的文件中,如下所示:

  <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 文件。

我使用 VisualStudioClean,这是容易理解和可预测的。知道它是如何工作的,知道它要删除什么文件,我就放心了。

以前我试过 VSClean(注意 VisualStudioClean 不是 VSClean) ,VSClean 更高级,它有许多配置,有时让我想知道它要删除什么文件?一个错误的配置将导致丢失我的源代码。测试配置将如何工作需要备份我所有的项目,这需要很多时间,所以最后我选择 VisualStudioClean。

结论: VisualStudioClean 如果你想要基本的清洁,VSClean 可以用于更复杂的场景。

我还不能添加评论(没有达到最低声誉)
因此,我在此强调:

使用 <RemoveDir Directories="$(BaseIntermediateOutputPath)" />的“ BeforeBuild”操作非常棒,但是对我来说,它与包含在同一个项目中的实体框架模型有冲突。

我收到的错误是:

Error reading resource '{mymodel}.csdl' -- 'Could not find a part of the path '{myprojectpath}\obj\Release\edmxResourcesToEmbed\{mymodel}.csdl

我认为,“ edmxResourcesToembed”是在执行“ BeforeBuild”目标操作之前创建的。

这个网站: 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 内部就会有一个 Clean 或者 Rebuild 操作 抓不住。

对于那些可能不知道的读者,PowerShell 支持 命令别名,在这里重写它不使用别名

Get-ChildItem -inc bin,obj -rec | Remove-Item -rec -force

注意: 您应该将它存储在 PowerShell 文件中,并将 文件位于解决方案的根目录(. sln 文件所在的位置) ,并且 然后运行它,当你想要一个适当的清洁(而不是米奇鼠标的 VisualStudio 做到了,并且报告了成功)。

这就是我如何处理批处理文件以递归方式删除所有 BIN 和 OBJ 文件夹。

  • 创建一个空文件并将其命名为 DeleteBinObjecFolders.bat
  • 将下面的代码复制粘贴到 DeleteBinObjecFolders.bat 中
  • 将 DeleteBinObjecFolders.bat 文件与解决方案(* . sln)文件移到同一文件夹中。
@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

我只保存源代码来存储我完成的 VS 项目。

我删除 BIN,DEBUG,释放,OBJ,ARM 和.vs 文件夹从所有的项目。

这大大减少了项目的规模

必须在从仓库中取出时重建。

如果有人没有意识到在 VB/C # 中将整个过程自动化到 zip 存档是多么容易的话,这里只是对上面所有好答案的补充。

所以你只需要从模板中抓取一个简单的 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 的方法是有一定价值的,特别是因为这可能是在漫长的一天结束时完成的,你不想在以后发现你的备份实际上并不存在..。

在窗口中打开资源管理器 导航到 SLN 文件夹 单击搜索字段,键入 obj 文件夹的 文件夹; 文件夹-> 使用 CTRL + A 并删除’em-对于 bin 也是一样的 成交

不需要任何工具或额外的软件;)

更新: Visual Studio 2019(发布前清理[ bin ]和[ obj ])。但是我不确定是否需要删除[ obj ]。请注意也放置了 nuget 包配置。如果您认为可以,可以删除第二行。

<Target Name="PreBuild" BeforeTargets="PreBuildEvent" Condition="'$(Configuration)' == 'Release'">
<!--remove bin-->
<Exec Command="rd /s /q &quot;$(ProjectDir)$(BaseOutputPath)&quot; &amp;&amp; ^" />
<!--remove obj-->
<Exec Command="rd /s /q &quot;$(BaseIntermediateOutputPath)Release&quot;" />
</Target>

这个答案 很棒,我只是想对答案的最后一部分进行评论

注意: 您应该将它存储在 PowerShell 文件中,并将 文件位于解决方案的根目录(. sln 文件所在的位置) ,并且 然后运行它,当你想要一个适当的清洁(而不是米奇鼠标的 VisualStudio 做到了,并且报告了成功)。

或者,您可以将以下内容添加到 profile.ps1

function CleanSolution {
Get-ChildItem -inc bin,obj -rec | Remove-Item -rec -force
}


Set-Alias cs CleanSolution

然后可以使用 清洁溶液CS运行。这样,您就可以在任何项目中使用它,而且不需要文件名的 ./前缀

Visual Studio 扩展

enter image description here

右击解决方案-选择“删除 bin 和 obj 文件夹”

完成可以从 VisualStudio 中调用的一行程序

在解决方案根文件夹中创建一个名为“ CleanBin.bat”的文件,并添加以下一行程序:

Powershell.exe -ExecutionPolicy Bypass -NoExit -Command "Get-ChildItem -inc bin,obj -rec | Remove-Item -rec -force"

运行. bat 文件。

原文链接: http://stackoverflow/a/43267730/1402498 https://stackoverflow.com/a/43267730/1402498 最初的答案显示了 powershell 命令,但是我在使其在我的系统上顺利工作时遇到了很多麻烦。我终于到达了上面的一行程序,对于大多数人来说,它应该能够很好地工作。

注意: 微软似乎很擅长让 Windows 安全导致更奇怪的行为。在我的机器上,当我运行这个脚本时,所有的 obj 和 bin 文件夹都被删除了,但是2秒钟后又重新出现!第二次运行脚本将导致永久删除。如果有人知道是什么导致了这种行为,请让我知道一个修复,我会更新的答案。

如果需要从所有项目中删除 bin 和 obj 文件夹..。

启动 git Bash 并输入以下命令:

find . -iname "bin" -o -iname "obj" | xargs rm -rf

对于 C # 项目,我建议将 $(配置)附加到 obj 文件夹,以避免删除存储在 对不起基本目录中的 nuget 文件。

<Target Name="CleanAndDelete"  AfterTargets="Clean">
<!-- Remove obj folder -->
<RemoveDir Directories="$(BaseIntermediateOutputPath)$(Configuration)" />
<!-- Remove bin folder -->
<RemoveDir Directories="$(BaseOutputPath)" />
</Target>

如果删除了 nuget 文件,重新创建它们可能会有问题。此外,我从未见过“恢复 NuGet 软件包”在这些文件被删除后修复这个问题的情况。