如何在 Visual Studio 中完全清理 bin 和 obj 文件夹?

Posted

技术标签:

【中文标题】如何在 Visual Studio 中完全清理 bin 和 obj 文件夹?【英文标题】:How to fully clean bin and obj folders within Visual Studio? 【发布时间】:2010-11-08 11:37:12 【问题描述】:

如果您右键单击一个文件夹,您将看到一个“清理”菜单项。我认为这会清理(删除) obj 和 bin 目录。 但是,据我所知,它什么也没做。 还有其他方法吗? (请不要告诉我去 Windows Explorer 或 cmd.exe) 我想删除 obj 和 bin 文件夹,以便我可以轻松地压缩整个文件。

【问题讨论】:

I want to delete all bin and obj folders to force all projects to rebuild everything的可能重复 如果由 CMake (CMakeLists.txt) 构建,则还可以有一个“CMakeSettings.json”文件。对我来说,这比 vcpkg 安装子目录高一级。该文件不是项目的 .gitignore 的一部分,因此对 Ruben 的 git clean ... 方法感到困惑。 【参考方案1】:

它不会删除文件夹,但会删除构建副产品。您是否有任何理由希望删除实际的构建文件夹

【讨论】:

我想删除编译不需要的所有内容,以便压缩并发送。 zip 文件中包含 .exe 可能会成为防病毒软件的问题。 是的。但正如我所说,构建 products 被删除。这意味着 .obj 和 .exe 文件。只是不是实际的文件夹。 如果某些引用被删除/移动并且 dll 没有在代码中引用,它们将不再内置到 bin 文件夹中,但它们也不会被清理。这最终会出现在本地与您构建的应用程序的对比中,但在其他任何地方都失败了。【参考方案2】:

Clean 将删除由构建过程创建的所有中间和最终文件,例如 .obj 文件和 .exe 或 .dll 文件。

但是,它不会删除构建这些文件的目录。 我没有看到为什么需要删除目录的令人信服的理由。 能再解释一下吗?

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

【讨论】:

我想删除 bin 和 obj 目录以便压缩所有内容。 “清理”不会删除 .exe。 刚刚用我的 Visual Studio 2005 试了一下,我可以验证“清理”确实删除了 .exe(和所有其他文件)。 可能在 Visual Studio 2010 中。现在,我可以确认“清洁解决方案”不会从 Debug/bin 文件夹中删除 dll。 如果文件不是由构建计算的,Clean 不会删除文件。如果某些文件通过其他机制传播到 outdir,则 clean 不会删除它们。换句话说,当戴上构建经理的帽子时,清洁是完全无用的,甚至是危险的。【参考方案3】:

查看 Ron Jacobs 出色的开源 CleanProject 如果您愿意,它甚至可以处理拉链。

这里是 CodePlex link

【讨论】:

【参考方案4】:

正如其他人已经响应的那样,Clean 将删除构建生成的所有工件。但它会抛开其他一切。

如果您在 MSBuild 项目中有一些自定义设置,这可能会带来麻烦并留下您认为应该删除的内容。

您可以通过简单地更改您的 .*proj 来规避这个问题,方法是在接近末尾的某处添加它:

<Target Name="SpicNSpan"
        AfterTargets="Clean">
    <RemoveDir Directories="$(OUTDIR)"/>
</Target>

这将删除当前平台/配置的 bin 文件夹中的所有内容。

------ 编辑 基于下面Shaman's answer 的轻微进化(分享投票并给他一些)

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

如果您有多个项目要推进,他还提供了一个很好的建议,使任务更易于部署和维护。

如果您对此答案投票,请务必同时投票。

【讨论】:

这是最好的解决方案,有效,不需要特殊工具,并确保每个团队成员都使用相同的“干净”方法。为什么 MS Visual Studio 不能正确清理对我来说完全是个谜。 这是迄今为止最简单的解决方案,无需任何外部插件即可完成工作 不确定如何激活/调用这个目标。仅选择“清洁”似乎没有任何作用。那么如何使用呢? @Rolf Visual Studio 默认情况下不会“正确”清理,因为 MS 必须支持 N 个不同项目输出到同一目录的用例。如果默认清理项目会破坏其整个输出目录,则它可能会破坏与该项目完全无关的文件。因此,默认行为是跟踪构建过程实际输出的文件,并仅删除那些干净的文件。清理时常见的一类损坏是由于在构建期间创建或复制文件而没有告诉 MSBuild 将其添加到跟踪列表中。 这个答案会导致 .Net Core 出现问题。下次尝试编译时,您将收到错误“资产文件 'c:\whatever\project.assets.json' 未找到。运行 NuGet 包还原以生成此文件。”。为避免这种情况,不要添加删除 obj 文件夹的行。【参考方案5】:

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

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

这里是文章:How to remove bin and/or obj folder before the build or deploy

【讨论】:

我也喜欢移除中介的想法,但是在 BeforeBuild 上挂钩有很大的副作用,因为它会消除执行增量构建的所有可能性。在需要大量时间来构建的项目中,这是一个展示停止器。此外,通过清除基本输出目录,您可能会干扰可能想要执行多目标/配置构建并在打包部署之前累积结果的工具,这里只有最后执行的构建将继续存在。【参考方案6】:

根据 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);
            
        
    

【讨论】:

【参考方案7】:

您可以在 Far Manager 中轻松查找和删除 binobj 文件夹。

    导航到您的解决方案并按 Alt+F7

    在搜索设置对话框中:

    在“一个文件掩码或多个文件掩码”字段中输入“bin,obj” 勾选选项“搜索文件夹” 按 Enter 键

    搜索完成后,将视图切换到“面板”

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

希望对某人有所帮助。

【讨论】:

用谷歌搜索了这个问题,寻找自动解决方案,专门停止在 FAR Manager 中手动执行此操作,哈哈【参考方案8】:

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

git clean -xdf --dry-run

绝对删除.gitignore 列表中的所有文件,即它将清理objbin 文件夹(x 会触发此行为)


注意:参数--dry-run只会模拟操作(“将删除...”)并告诉您git 删除什么。试试dry-run,然后去掉参数,真的会删除文件+文件夹。

或者,在该 clean 命令之后,您可以使用 dotnet restore mySolution.sln 来恢复所有 NUGET 包。而且,如果您仍然打开了开发者控制台,之后您可以快速运行 msbuild -m mySolution.sln(无需打开 Visual Studio)来查看它是否成功。

【讨论】:

这很好用。当您想要在整个解决方案范围内而不是仅在一个 Visual Studio 项目中进行时非常方便 @JoeHealy 比起先清理然后压缩,use git-archive 直接从 repo 压缩可能更容易。 像魅力一样工作!这是最好的答案。另外,如果,假设项目没有使用源代码管理,这个答案仍然适用:只需将项目添加到源代码管理(右键单击解决方案名称),然后运行上面的 git 命令。顺便说一句,你如何在 Windows 中使用 git 命令?我不得不在 Windows 上的 Ubuntu 上使用 Bash。 @brett 有趣 ;) 我通常使用 GitHub for Windows 来铺路(尽管我很确定 VS 安装了一个可以从 VS 命令提示符使用的工作平台) - 设置允许您选择一个 shell安排(我从中选择 PoshGit)。使用 WSL 是最具教育意义的,非常棒! 好的。现在我明白了;关键是--dry-run,这只会告诉你要删除的内容。不错【参考方案9】:

对于 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>

请注意,此 sn-p 还会清除解决方案根目录中的 .vs 文件夹。如果您觉得删除 .vs 文件夹太过分了,您可能需要注释掉相关行。我启用了它,因为我注意到在某些第三方项目中,当文件 ala application.config 存在于 .vs 文件夹中时,它会导致问题。

附录:

如果您要优化解决方案的可维护性,您可能希望更进一步,将上述 sn-p 放入单独的文件中,如下所示:

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

【讨论】:

有什么好的方法可以删除文件夹中的所有文件,除了一个特定的文件? @progLearner 当然有***.com/a/10019708/863651 另外,我注意到 bin 目录中的某些 dll 有时会出现一些文件锁定。有没有办法强制删除文件? @progLearner 这是一个很难正确回答的问题。如果我们坚持 2 或 3 次,某些文件似乎已被锁定,那么它们确实会被删除。然后在某些情况下,文件确实被锁定了,然后你就不走运了,因为你不能删除它们,除非你杀死锁定它们的进程。如果您处于场景 #1 中,那么您可以尝试最新的 MSBuildCommunityTasks 中的删除目录操作,该操作确实具有持久删除标志(您可以阅读此文档,因为它超出了此特定线程的范围) 我遇到了类似的问题。在后台运行一个名为 VSCompiler.exe 的进程或类似的东西。您可以在删除目录之前先尝试终止此进程并查看它是否有效(我认为它会)。祝你好运!【参考方案10】:

我使用VisualStudioClean,它易于理解和预测。知道它是如何工作的以及它将删除哪些文件让我松了一口气。

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

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

【讨论】:

【参考方案11】:

我还不能添加评论(没有达到最低声誉) 所以我留下这个回复强调:

&lt;RemoveDir Directories="$(BaseIntermediateOutputPath)" /&gt; 的“BeforeBuild”操作很棒,但对我来说,它与包含在同一项目中的实体框架模型冲突。

我收到的错误是:

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

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

【讨论】:

【参考方案12】:

此站点: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 可以,并且也报告成功)。

【讨论】:

请注意,如果您使用像 mercurial 这样的版本控制系统,并且它与此脚本位于同一目录级别,如果您将任何内容存储在“bin”文件夹中,此脚本将损坏您的存储库...否则这是一个非常有用的脚本!【参考方案13】:

这就是我使用批处理文件递归删除所有 BIN 和 OBJ 文件夹的方法。

创建一个空文件并将其命名为 DeleteBinObjFolders.bat 将以下代码复制粘贴到 DeleteBinObjFolders.bat 中 将 DeleteBinObjFolders.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

【讨论】:

【参考方案14】:

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

我从所有项目中删除了 BIN、DEBUG、RELEASE、OBJ、ARM 和 .vs 文件夹。

这大大减少了项目的规模。项目

从存储中取出时必须重新构建。

【讨论】:

【参考方案15】:

如果有人没有意识到在 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 的交互式方法是有价值的,特别是因为这可能是在漫长的一天结束时完成的,并且您不想稍后发现您的备份实际上并不存在...

【讨论】:

【参考方案16】:

在 Windows 中只需打开资源管理器 导航到您的 SLN 文件夹 点击搜索字段并输入 kind:=folder;obj --> 用于 obj 文件夹 使用 CTRL+A 并删除它们 - 与 bin 相同 完成

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

【讨论】:

【参考方案17】:

更新: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>

【讨论】:

【参考方案18】:

this answer 太好了,我只想评论答案的最后一部分

注意:您应该将其存储在 PowerShell 文件中并将其放置 解决方案根目录下的文件(.sln 文件所在的位置),以及 然后在您想要适当清洁时运行它(不是那种 VisualStudio 可以,并且也报告成功)。

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

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


Set-Alias cs CleanSolution 

然后您可以使用 CleanSolutioncs 来运行。这样你就可以将它用于任何项目,并且没有文件名的 ./ 前缀

【讨论】:

【参考方案19】:

Visual Studio 扩展

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

【讨论】:

【参考方案20】:

可以在 Visual Studio 中调用的完整单行代码

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

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

运行 .bat 文件。享受吧。

此处答案的原始信誉:https://***.com/a/43267730/1402498 最初的答案显示了 powershell 命令,但是我在让它在我的系统上顺利运行时遇到了很多麻烦。我终于到达了上面的单线,这对大多数人来说应该很好用。

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

【讨论】:

以上是关于如何在 Visual Studio 中完全清理 bin 和 obj 文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010 中的代码自动清理

如何完全卸载 Visual Studio 2010?

Visual Studio 编译正常,但仍显示红线

Visual Studio 负载测试启动和清理方法

visual studio2017注册表删除

Python.清理Visual Studio工程