157

If you right click on a folder, you will see a "Clean" menu item. I assumed this would clean (remove) the obj and bin directory. However, as far as I can see, it does nothing. Is there another way? (please don't tell me to go to Windows Explorer or the cmd.exe) I'd like to remove the obj and bin folder so that I can easily zip the whole thing.

2

22 Answers 22

156

As others have responded already Clean will remove all artifacts that are generated by the build. But it will leave behind everything else.

If you have some customizations in your MSBuild project this could spell trouble and leave behind stuff you would think it should have deleted.

You can circumvent this problem with a simple change to your .*proj by adding this somewhere near the end :

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

Which will remove everything in your bin folder of the current platform/configuration.

------ Edit Slight evolution based on Shaman's answer below (share the votes and give him some too)

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

---- Edit again with parts from xDisruptor but I removed the .vs deletion as this would be better served in a .gitignore (or equivalent)

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

He also provides a good suggestion on making the task easier to deploy and maintain if you have multiple projects to push this into.

If you vote this answer be sure to vote them both as well.

Sign up to request clarification or add additional context in comments.

16 Comments

This is the best solution, works, doesn't require special tools and makes sure every teammember uses the same "clean" method. Why MS Visual Studio doesn't clean properly is a complete mystery to me.
This is by far the easiest solution to implement and gets the job done without any external plugins
Not sure how to activate/call this target. Just choosing 'Clean' does not appear to do anything. So how do I use it?
@Rolf Visual Studio doesn't clean "properly" by default because MS has to support the use case where N different projects output to the same directory. If cleaning a project clobbered its entire output directory by default, it could clobber files entirely unrelated to that project. So instead the default behavior is to keep track of files that are actually output by the build process and delete only those files on clean. A common class of breakage at clean time is caused by creating or copying a file during the build without telling MSBuild to add it to the tracking list.
This answer as it is causes problems with .Net Core. The next time you try and compile you'll get the error "Assets file 'c:\whatever\project.assets.json' not found. Run a NuGet package restore to generate this file.". To avoid this, don't add the line to remove the obj folder.
|
107

If you are using git and have a correct .gitignore in your project, you can

git clean -xdf --dry-run 

to remove absolutely every file on the .gitignore list, i.e. it will clean obj, and bin folders (the x triggers this behavior)


Note: The parameter --dry-run will only simulate the operation ("Would remove ...") and show you what git would delete. Try it with dry-run, then remove the parameter and it will really delete the files+folders.

Optionally, after that clean command, you can use dotnet restore mySolution.sln to get all the NUGET packages restored. And if you have a developer console open anyway,
you can quickly run msbuild -m mySolution.sln afterwards (without having Visual Studio open) to see if it was successful.

11 Comments

This works beautifully. Very convenient when you want to do solution wide instead of just one Visual Studio project
@JoeHealy In stead of cleaning first and then zipping, it might be easier to use git-archive to zip directly from the repo.
Works like a charm! This is the best answer. Also if, let's say the project is not using source control, this answer still aplies: just add the project to source control (right click on solution name), then run the git command above. Btw, how do you use git commands in Windows? I had to use Bash on Ubuntu on Windows.
ok. now I see; the key is --dry-run, this will only tells you what's gonna be deleted. nice
This will remove everything including the .vs folder, .suo file, packages folder etc. Typically you dont want that. I only want bin and obj to go away
|
58

For Visual Studio 2015 the MSBuild variables have changed a bit:

<?xml version="1.0" encoding="utf-8"?> <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> 

Notice that this snippet also wipes out the .vs folder from the root directory of your solution. You may want to comment out the associated line if you feel that removing the .vs folder is an overkill. I have it enabled because I noticed that in some third party projects it causes issues when files ala application.config exist inside the .vs folder.

Addendum:

If you are into optimizing the maintainability of your solutions you might want to take things one step further and place the above snippet into a separate file like so:

<?xml version="1.0" encoding="utf-8"?> <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> 

And then include this file at the very end of each and every one of your *.csproj files like so:

 [...] <Import Project="..\..\Tools\ExtraCleanup.targets"/> </Project> 

This way you can enrich or fine-tune your extra-cleanup-logic centrally, in one place without going through the pains of manually editing each and every *.csproj file by hand every time you want to make an improvement.

12 Comments

@progLearner ofcourse there is stackoverflow.com/a/10019708/863651
@progLearner it's a tricky question to answer properly. Some files appear to be locked yet if we persist 2 or 3 times then they do get deleted. Then there are cases where files are truly locked indeed and then you are out of luck because you can't delete them unless and until you kill the processes locking them. If you are in scenario #1 then you can try the delete-directory action from the latest MSBuildCommunityTasks which does have a persist-delete flag (you can read the docs on this one because it's outside the scope of this particular thread)
I had a similar problem. There is a process running in the background called VSCompiler.exe or something to that effect. You can try killing this process first before you delete the directory and see if it works (I think it will). Good luck mate!
While this is correct, it seems to break NuGet until you reload the project.
Another great advantage of importing the snippet is that you can modify ExtraCleanup.targets after the projects have been loaded. Useful when you are testing your snippet.
|
50

To delete bin and obj before build add to project file:

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

Here is article: How to remove bin and/or obj folder before the build or deploy

2 Comments

I like the idea of removing the intermediaries as well, however there are significant side effects to hooking at BeforeBuild as it will wipe all possibilities to perform incremental builds. In projects that take significant amount of time to build this is a show stopper. Also by wiping out the base output dir you may interfere with tools that may want to perform multi-target/configuration builds and cumulate the results prior to packaging it for deployment, here only the last build performed will survive.
this is great. if you switch platforms/frameworks for example, all the old output remains behind and doesn't get removed by a normal clean.
29

This site: https://sachabarbs.wordpress.com/2014/10/24/powershell-to-clean-visual-studio-binobj-folders/ uses William Kempf's powershell commands to remove any bin and obj folders from the current directory and sub directories. It should be possible to run it from the root of the drive.

Here is William's version

 gci -inc bin,obj -rec | rm -rec -force 

In William's own words:

That wipes out all of the “bin” and “obj” directories in the current directory and every subdirectory. Super useful to run in your workspace directory to get to a “clean” state, especially when someone messes up and there’s something that a Clean or Rebuild inside the IDE doesn’t catch.

For those of you reading that may not know, PowerShell supports command aliases, here it is rewritten again not using the aliases

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

NOTE : You should have this stored in a PowerShell file and place that file at the root of your solution (where the .sln file resides), and then run it when you want a proper clean (not the micky mouse one that VisualStudio does, and reports success too).

1 Comment

Be aware that if you use a version control system like mercurial and it is in the same directory level as this script, this script will corrupt your repository if you store anything on it inside a "bin" folder ... otherwise this is a very useful script!
12

Check out Ron Jacobs fantastic open source CleanProject It even takes care of the zipping if you like.

Here is the CodePlex link

Comments

9

Visual Studio Extension

enter image description here

Right Click Solution - Select "Delete bin and obj folders"

1 Comment

There is a different extension for VS2022 now: "Clean Bin and Obj" marketplace.visualstudio.com/…
4

You can easily find and remove bin and obj folders in Far Manager.

  1. Navigate to you solution and press Alt+F7
  2. In search setting dialog:

    • Type "bin,obj" in field "A file mask or several file masks"
    • Check option "Search for folders"
    • Press Enter
  3. After the search is done, switch view to "Panel".

  4. Select all files (with Ctrl+A) and delete folders (press "Shift+Del")

Hope it helps someone.

1 Comment

googled this question looking for automatic solution specifically to stop manually doing it in FAR Manager lol
4

In windows just open the explorer navigate to your SLN folder click into search field and type kind:=folder;obj --> for obj folders use CTRL+A and delete 'em - same for bin Done

No need for any tool or extra software ;)

1 Comment

:=obj is shorter to type. (Assuming you never have a file that is named exactly obj.)
3

This is how I do with a batch file to delete all BIN and OBJ folders recursively.

  • Create an empty file and name it DeleteBinObjFolders.bat
  • Copy-paste code the below code into the DeleteBinObjFolders.bat
  • Move the DeleteBinObjFolders.bat file in the same folder with your solution (*.sln) file.
@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 

Comments

3

Based on Joe answer, I've converted the VB code into 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); } } } } 

Comments

2

I use VisualStudioClean which is easy to understand and predictable. Knowing how it works and what files it is going to delete relieves me.

Previously I tried VSClean (note VisualStudioClean is not VSClean), VSClean is more advanced, it has many configurations that sometimes makes me wondering what files it is going to delete? One mis-configuration will result in lose of my source codes. Testing how the configuration will work need backing up all my projects which take a lot of times, so in the end I choose VisualStudioClean instead.

Conclusion : VisualStudioClean if you want basic cleaning, VSClean for more complex scenario.

Comments

2

I can't add a comment yet (no minimal reputation reached)
so I leave this reply to underline that:

the "BeforeBuild" action with <RemoveDir Directories="$(BaseIntermediateOutputPath)" /> is great but, for me, is conflicting with an Entity Framework model included into the same project.

The error I receive is:

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

I suppose, the "edmxResourcesToembed" is created before the "BeforeBuild" target action is executed.

Comments

2

For C# projects, I recommend appending $(Configuration) to obj folder, so-as to avoid deleting nuget files which are stored on obj base directory.

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

If you delete the nuget files, it can be problematic to recreate them. Moreover, I've never seen a case where "Restore NuGet Packages" fixes this issue after these files have been deleted.

1 Comment

As seen here, VS 2022 now stores nugets in user's AppData.
1

Clean will remove all intermediate and final files created by the build process, such as .obj files and .exe or .dll files.

It does not, however, remove the directories where those files get built. I don't see a compelling reason why you need the directories to be removed. Can you explain further?

If you look inside these directories before and after a "Clean", you should see your compiled output get cleaned up.

6 Comments

I want to remove bin and obj directories in order to zip everything.
"Clean" does not remove the .exe.
Just tried it with my Visual Studio 2005, and I can verify that "Clean" did remove the .exe (and all other files).
In Visual Studio 2010, maybe. Right now, I can confirm that a "Clean Solution" does not remove dlls from the Debug/bin folders.
Clean does not delete files if they are not computed by the build. If some files travel to the outdir by some other mecanism then clean will not delete them. In other words, when wearing build manager`s hat, clean is completely and utterly useless, dangerous even.
|
1

Update: Visual Studio 2019 (Clean [bin] and [obj] before release). However I am not sure if [obj] needs to be deleted. Be aware there is nuget package configuration placed too. You can remove the second line if you think so.

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

Comments

0

I store my finished VS projects by saving only source code.

I delete BIN, DEBUG, RELEASE, OBJ, ARM and .vs folders from all projects.

This reduces the size of the project considerably. The project

must be rebuilt when pulled out of storage.

1 Comment

FWIW: A typical (default) folder hierarchy puts debug,release,arm etc. as subfolders of bin. Makes it easier to delete non-source-code files.
0

Just an addendum to all the fine answers above in case someone doesn't realize how easy it is in VB/C# to automate the entire process down to the zip archive.

So you just grab a simple Forms app from the templates (if you don't already have a housekeeping app) and add a button to it and then ClickOnce install it to your desktop without worrying about special settings or much of anything. This is all the code you need to attach to the button:

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 

One thing to remember is that file system deletes can go wrong easily. One of my favorites was when I realized that I couldn't delete a folder because it contained items created by Visual Studio while running with elevated privileges (so that I could debug a service).

I needed to manually give permission or, I suppose, run the app with elevated privileges also. Either way, I think there is some value in using an interactive GUI-based approach over a script, specially since this is likely something that is done at the end of a long day and you don't want to find out later that your backup doesn't actually exist...

Comments

0

this answer is great I just want to comment on the last part of the answer

NOTE : You should have this stored in a PowerShell file and place that file at the root of your solution (where the .sln file resides), and then run it when you want a proper clean (not the micky mouse one that VisualStudio does, and reports success too).

Alternatively, you can add the following to your profile.ps1

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

Then you can use either CleanSolution or cs to run. That way you can use it for any project and without the ./ prefix of the filename

Comments

0

Complete one-liner you can invoke from within Visual Studio

In your solution root folder create a file called "CleanBin.bat" and add the following one-liner:

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

Run the .bat file. Enjoy.

Original creds to the answer here: https://stackoverflow.com/a/43267730/1402498 The original answer shows the powershell command, but I had a lot of trouble making it work smoothly on my system. I finally arrived at the one-liner above, which should work nicely for most folks.

Caveat: Microsoft seems to be great at making Windows security cause stranger and stranger behavior. On my machine, when I run the script, all obj and bin folders are deleted but then reappear 2 seconds later! Running the script a second time causes permanent deletion. If anyone knows what would cause this behavior, please let me know a fix and I'll update the answer.

1 Comment

Visual Studio tends to create obj and bin folders in the background. IMHO, its best to run a script without VS running.
0

for visual studio 2022 you can use: https://marketplace.visualstudio.com/items?itemName=MadsKristensen.CleanSolution

1 Comment

I wonder if this can be achieved by the extension, why don't MS fix it in VS in the first place?
-1

If you need to delete bin and obj folders from ALL of your projects...

Launch git Bash and enter the following command:

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.