如何清理Visual Studio bin和obj文件夹

时间:2009-07-06 18:39:49

标签: visual-studio msbuild

如果右键单击文件夹,您将看到“清洁”菜单项。我假设这将清理(删除)obj和bin目录。 但是,据我所见,它什么也没做。 还有另外一种方法吗? (请不要告诉我转到Windows资源管理器或cmd.exe) 我想删除obj和bin文件夹,以便我可以轻松压缩整个文件夹。

19 个答案:

答案 0 :(得分:84)

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

如果你有多个项目可以推动这项工作,他还提供了一个很好的建议,让任务更容易部署和维护。

如果你投票这个答案,一定要投票给他们。

答案 1 :(得分:34)

对于Visual Studio 2015,MSBuild变量有所改变:

require_once

请注意,此代码段还会从解决方案的根目录中清除.vs文件夹。如果您认为删除.vs文件夹是一种过度杀伤,则可能需要注释掉关联的行。我启用它是因为我注意到在某些第三方项目中,当.vs文件夹中存在文件ala application.config时会导致问题。

附录:

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

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

然后将此文件包含在每个* .csproj文件的最末端,如下所示:

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

答案 2 :(得分:29)

要在构建添加到项目文件之前删除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

答案 3 :(得分:26)

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

git clean -xdf --dry-run

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

答案 4 :(得分:12)

查看Ron Jacobs梦寐以求的开源CleanProject如果你愿意,它甚至可以解决这个问题。

以下是CodePlex link

答案 5 :(得分:9)

此站点:https://sachabarbs.wordpress.com/2014/10/24/powershell-to-clean-visual-studio-binobj-folders/使用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文件所在的位置),然后在需要正确清理时运行它(不是那个micky mouse VisualStudio可以,并报告成功。)

答案 6 :(得分:2)

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

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

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

答案 7 :(得分:2)

Visual Studio扩展

enter image description here

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

答案 8 :(得分:2)

在Windows中,只需打开资源管理器 导航到您的SLN文件夹 单击进入搜索字段,然后为obj文件夹键入 kind:= folder; obj -> 使用CTRL + A并删除'em-bin相同 完成

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

答案 9 :(得分:2)

我无法添加评论(达不到最低声誉)
所以我留下这个答复强调:

&#34; BeforeBuild&#34;使用<RemoveDir Directories="$(BaseIntermediateOutputPath)" />的操作很棒,但对我而言,与同一项目中包含的实体框架模型相冲突。

我收到的错误是:

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

我想,&#34; edmxResourcesToembed&#34;是在&#34; BeforeBuild&#34;之前创建的。目标行动已经执行。

答案 10 :(得分:2)

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

  1. 导航至您的解决方案,然后按 Alt + F7
  2. 在搜索设置对话框中:

    • 在“文件掩码或多个文件掩码”字段中键入“bin,obj”
    • 检查选项“搜索文件夹”
    • 按Enter键
  3. 搜索完成后,将视图切换为“面板”

  4. 选择所有文件(使用Ctrl + A)并删除文件夹(按“Shift + Del”)
  5. 希望它有所帮助。

答案 11 :(得分:2)

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

答案 12 :(得分:1)

我使用易于理解和可预测的VisualStudioClean。知道它是如何工作的以及它要删除的文件让我感到安心。

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

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

答案 13 :(得分:1)

这是我如何使用批处理文件递归删除所有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 :(得分:1)

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

答案 15 :(得分:0)

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

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

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

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

答案 16 :(得分:0)

只是以上所有好的答案的附录,以防万一有人不知道在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的交互式方法都具有一定的价值,特别是因为这很可能是在漫长的一天结束时完成的,因此您不希望以后再发现备份实际上不存在...

答案 17 :(得分:0)

更新: 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 :(得分:0)

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

注意:您应该将其存储在PowerShell文件中,并将其放置在 文件位于解决方案的根目录(.sln文件所在的位置),并且 然后在需要适当清洁时运行它(而不是像 VisualStudio会这样做,并且也会报告成功。)

或者,您可以在个人资料中添加以下内容。ps1

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

Set-Alias cs CleanSolution 

然后,您可以使用 CleanSolution cs 来运行。这样,您可以将其用于任何项目,而无需文件名的 ./ 前缀