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


91

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


Answers:


101

当其他人已经做出响应时,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>

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

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


16
这是最好的解决方案,可以正常工作,不需要特殊工具,并确保每个团队成员都使用相同的“干净”方法。为什么MS Visual Studio无法正确清理对我来说是一个完全的谜。
罗尔夫2013年

1
到目前为止,这是最简单的解决方案,无需任何外部插件
即可

不确定如何激活/调用此目标。仅选择“清洁”似乎没有任何作用。那么我该如何使用呢?
aliceraunsbaek 2014年

抱歉,刚才看到您的评论。指定AfterTargets =“ Clean”将把目标挂钩到VisualStudio的内部清理目标。但是,这个简单的目标不会向控制台提供任何feedbaco,因此除了清除$(OUTDIR)存在之外,它不会做任何其他事情。您可以向其中添加一些错误管理和消息,以获得更好的反馈。
Newtopian 2014年

2
@Rolf Visual Studio默认情况下不会“正确”清理,因为MS必须支持将N个不同项目输出到同一目录的用例。如果清理项目默认情况下破坏了整个输出目录,则可能破坏与该项目完全无关的文件。因此,默认行为是跟踪构建过程实际输出的文件,并仅删除干净的文件。清理时常见的损坏类别是由在生成期间创建或复制文件而没有告知MSBuild将其添加到跟踪列表中引起的。
Timbo

43

如果您使用的是git且.gitignore项目中有正确的名称,则可以

git clean -xdf --dry-run

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


2
这很漂亮。当您想做广泛的解决方案而不是一个Visual Studio项目时,这非常方便
Ehtesh Choudhury

@JoeHealy除了先清洗然后压缩外,使用git-archive直接从仓库中压缩可能会更容易。
Reinier Torenbeek

奇迹般有效!这是最好的答案。同样,如果说该项目未使用源代码管理,则此答案仍然适用:只需将项目添加到源代码管理(右键单击解决方案名称),然后运行上面的git命令。顺便说一句,您如何在Windows中使用git命令?我必须在Windows的Ubuntu上使用Bash。
布雷特

@brett有趣的;)我通常使用GitHub for Windows进行铺装(尽管我很确定VS安装了可以在VS命令提示符下使用的工作平台)-这些设置可让您选择外壳排列(我从中选择PoshGit) 。使用WSL是最有教育意义的事情,真是个好电话!
Ruben Bartelink '18

2
好。现在我明白了; 关键是--dry-run,这只会告诉您要删除的内容。不错
mkb

42

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


有什么好方法可以删除一个文件夹中的所有文件,但不能删除其中一个文件?
progLearner

1
XDS

太棒了!谢谢!
progLearner

1
@progLearner这是一个很难回答的棘手问题。有些文件似乎被锁定了,但是如果我们坚持2到3次,那么它们确实会被删除。然后,在某些情况下确实确实锁定了文件,然后您就走运了,因为除非您取消杀死锁定它们的进程,否则您无法删除它们。如果您处于方案#1中,则可以尝试使用最新的MSBuildCommunityTasks中的delete-directory操作,该操作确实具有persiste-delete标志(您可以阅读其中的文档,因为它不在该特定线程的范围内)
XDS

1
我有一个类似的问题。有一个在后台运行的名为VSCompiler.exe的进程或类似的东西。您可以先删除该过程,然后再删除目录,看看它是否有效(我认为可以)。祝你好运!
XDS

31

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

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

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


3
我也喜欢删除中介的想法,但是钩在BeforeBuild上会有很大的副作用,因为它将消除执行增量构建的所有可能性。在需要大量时间来构建的项目中,这是一个秀场止步。同样,通过清除基本输出目录,您可能会干扰可能想要执行多目标/配置构建并在打包结果以进行部署之前对其进行累积的工具,此处只有最后执行的构建才能保留下来。
Newtopian

21

该站点: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”文件夹中,则此脚本将损坏您的存储库...否则,这非常有用的脚本!
Loudenvier18年


4

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

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

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

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

希望它可以帮助某人。


1
谷歌搜索这个问题,寻找专门的解决方案,以专门停止在FAR Manager中大声笑
弗拉德

3

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

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


2

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


我想删除编译时不需要的所有内容,以便将其压缩并发送。压缩文件中包含.exe可能是防病毒问题。
tom7

是。但是正如我所说,构建产品已删除。这意味着.obj和.exe文件。只是不是实际的文件夹。
Christopher

如果删除/移动了某些引用,并且代码中未引用dll,则它们不再内置到bin文件夹中,但是也不会被清除。这最终会在所构建的应用程序的本地版本中出现,但在其他地方都失败了。
Oli4

2

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

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

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


我想删除bin和obj目录以压缩所有内容。
tom7

5
“清除”不会删除.exe。
tom7

刚刚在我的Visual Studio 2005中进行了尝试,我可以验证“清除”确实删除了.exe(以及所有其他文件)。
abelenky

4
也许在Visual Studio 2010中。现在,我可以确认“清洁解决方案”没有从Debug / bin文件夹中删除dll。
基思·霍夫曼

4
如果构建未计算文件,Clean不会删除文件。如果某些文件由于其他机制而移到了外地目录,则清理不会删除它们。换句话说,当戴上施工经理的帽子时,清洁是完全毫无用处的,甚至是危险的。
Newtopian 2012年

2

我还不能添加评论(没有达到最低声誉),
所以我在此回复中强调以下内容:

“ 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”目标操作之前创建的。


2

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

1

我使用VisualStudioClean,它易于理解且可预测。知道它是如何工作的以及它将要删除哪些文件使我感到欣慰。

以前我尝试过VSClean(注意VisualStudioClean不是VSClean),VSClean更高级,它具有许多配置,有时使我想知道要删除哪些文件?一种错误的配置将导致我的源代码丢失。测试配置的工作方式需要备份我的所有项目,这需要花费很多时间,因此最终我选择VisualStudioClean。

结论:VisualStudioClean如果要基本清洁,VSClean适用于更复杂的情况。


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

0

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

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

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

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


0

如果有人没有意识到将整个过程自动化到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的交互式方法都具有一定的价值,特别是因为这很可能是在漫长的一天结束时完成的,并且您不希望以后再发现备份实际上不存在...


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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.