├── .gitignore ├── LICENSE ├── README.md └── osu-cleaner ├── App.config ├── Form1.Designer.cs ├── Form1.cs ├── Form1.en.resx ├── Form1.resx ├── Program.cs ├── Properties ├── AssemblyInfo.cs ├── Resources.Designer.cs ├── Resources.resx ├── Settings.Designer.cs └── Settings.settings ├── osu-cleaner.csproj └── osu-cleaner.sln /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | bld/ 21 | [Bb]in/ 22 | [Oo]bj/ 23 | [Ll]og/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | project.lock.json 45 | artifacts/ 46 | 47 | *_i.c 48 | *_p.c 49 | *_i.h 50 | *.ilk 51 | *.meta 52 | *.obj 53 | *.pch 54 | *.pdb 55 | *.pgc 56 | *.pgd 57 | *.rsp 58 | *.sbr 59 | *.tlb 60 | *.tli 61 | *.tlh 62 | *.tmp 63 | *.tmp_proj 64 | *.log 65 | *.vspscc 66 | *.vssscc 67 | .builds 68 | *.pidb 69 | *.svclog 70 | *.scc 71 | 72 | # Chutzpah Test files 73 | _Chutzpah* 74 | 75 | # Visual C++ cache files 76 | ipch/ 77 | *.aps 78 | *.ncb 79 | *.opendb 80 | *.opensdf 81 | *.sdf 82 | *.cachefile 83 | *.VC.db 84 | *.VC.VC.opendb 85 | 86 | # Visual Studio profiler 87 | *.psess 88 | *.vsp 89 | *.vspx 90 | *.sap 91 | 92 | # TFS 2012 Local Workspace 93 | $tf/ 94 | 95 | # Guidance Automation Toolkit 96 | *.gpState 97 | 98 | # ReSharper is a .NET coding add-in 99 | _ReSharper*/ 100 | *.[Rr]e[Ss]harper 101 | *.DotSettings.user 102 | 103 | # JustCode is a .NET coding add-in 104 | .JustCode 105 | 106 | # TeamCity is a build add-in 107 | _TeamCity* 108 | 109 | # DotCover is a Code Coverage Tool 110 | *.dotCover 111 | 112 | # NCrunch 113 | _NCrunch_* 114 | .*crunch*.local.xml 115 | nCrunchTemp_* 116 | 117 | # MightyMoose 118 | *.mm.* 119 | AutoTest.Net/ 120 | 121 | # Web workbench (sass) 122 | .sass-cache/ 123 | 124 | # Installshield output folder 125 | [Ee]xpress/ 126 | 127 | # DocProject is a documentation generator add-in 128 | DocProject/buildhelp/ 129 | DocProject/Help/*.HxT 130 | DocProject/Help/*.HxC 131 | DocProject/Help/*.hhc 132 | DocProject/Help/*.hhk 133 | DocProject/Help/*.hhp 134 | DocProject/Help/Html2 135 | DocProject/Help/html 136 | 137 | # Click-Once directory 138 | publish/ 139 | 140 | # Publish Web Output 141 | *.[Pp]ublish.xml 142 | *.azurePubxml 143 | # TODO: Comment the next line if you want to checkin your web deploy settings 144 | # but database connection strings (with potential passwords) will be unencrypted 145 | *.pubxml 146 | *.publishproj 147 | 148 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 149 | # checkin your Azure Web App publish settings, but sensitive information contained 150 | # in these scripts will be unencrypted 151 | PublishScripts/ 152 | 153 | # NuGet Packages 154 | *.nupkg 155 | # The packages folder can be ignored because of Package Restore 156 | **/packages/* 157 | # except build/, which is used as an MSBuild target. 158 | !**/packages/build/ 159 | # Uncomment if necessary however generally it will be regenerated when needed 160 | #!**/packages/repositories.config 161 | # NuGet v3's project.json files produces more ignoreable files 162 | *.nuget.props 163 | *.nuget.targets 164 | 165 | # Microsoft Azure Build Output 166 | csx/ 167 | *.build.csdef 168 | 169 | # Microsoft Azure Emulator 170 | ecf/ 171 | rcf/ 172 | 173 | # Windows Store app package directories and files 174 | AppPackages/ 175 | BundleArtifacts/ 176 | Package.StoreAssociation.xml 177 | _pkginfo.txt 178 | 179 | # Visual Studio cache files 180 | # files ending in .cache can be ignored 181 | *.[Cc]ache 182 | # but keep track of directories ending in .cache 183 | !*.[Cc]ache/ 184 | 185 | # Others 186 | ClientBin/ 187 | ~$* 188 | *~ 189 | *.dbmdl 190 | *.dbproj.schemaview 191 | *.pfx 192 | *.publishsettings 193 | node_modules/ 194 | orleans.codegen.cs 195 | 196 | # Since there are multiple workflows, uncomment next line to ignore bower_components 197 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 198 | #bower_components/ 199 | 200 | # RIA/Silverlight projects 201 | Generated_Code/ 202 | 203 | # Backup & report files from converting an old project file 204 | # to a newer Visual Studio version. Backup files are not needed, 205 | # because we have git ;-) 206 | _UpgradeReport_Files/ 207 | Backup*/ 208 | UpgradeLog*.XML 209 | UpgradeLog*.htm 210 | 211 | # SQL Server files 212 | *.mdf 213 | *.ldf 214 | 215 | # Business Intelligence projects 216 | *.rdl.data 217 | *.bim.layout 218 | *.bim_*.settings 219 | 220 | # Microsoft Fakes 221 | FakesAssemblies/ 222 | 223 | # GhostDoc plugin setting file 224 | *.GhostDoc.xml 225 | 226 | # Node.js Tools for Visual Studio 227 | .ntvs_analysis.dat 228 | 229 | # Visual Studio 6 build log 230 | *.plg 231 | 232 | # Visual Studio 6 workspace options file 233 | *.opt 234 | 235 | # Visual Studio LightSwitch build output 236 | **/*.HTMLClient/GeneratedArtifacts 237 | **/*.DesktopClient/GeneratedArtifacts 238 | **/*.DesktopClient/ModelManifest.xml 239 | **/*.Server/GeneratedArtifacts 240 | **/*.Server/ModelManifest.xml 241 | _Pvt_Extensions 242 | 243 | # Paket dependency manager 244 | .paket/paket.exe 245 | paket-files/ 246 | 247 | # FAKE - F# Make 248 | .fake/ 249 | 250 | # JetBrains Rider 251 | .idea/ 252 | *.sln.iml 253 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 henntix 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # osu-cleaner 2 | Small tool, written in C#, to clean unused elements from beatmaps. 3 | 4 | If you are using a SSD, you will be happy! Deleting those elements will save your disk space even by few gigabytes. You can choose what to delete: videos, storyboards, beatmap skins, backgrounds and hitsounds. You can also choose to move those files instead of permanent purge. 5 | 6 | ## Download 7 | ### Latest release: v1.05 (06.11.2018) [Download here!](https://github.com/henntix/osu-cleaner/releases/download/1.0/osu-cleaner.exe) 8 | 9 | 10 | ## License: The MIT License (MIT) 11 | 12 | 13 | > Contributors are appreciated. If you want to contribute and add something, fork it and send me a pull request. 14 | 15 | > If you find issues or bugs, report them via Issues page. Please also report if something has been not deleted but it should be. 16 | 17 | ## Changelog 18 | * v1.0 (06.11.2018) Initial release, written in 2016 19 | 20 | --- 21 | 22 | ## Known Issues 23 | * Some storyboard elements are not deleted due to not being used on actual storyboard. This cannot be easily fixed due to storyboard elements finding approach. This issue could be fixed by implementing *"unused elements cleaner"* which will delete all files except \*osu, audio files and whitelisted elements mentioned above, selected by user 24 | * \*.osb files are not deleted. -------------------------------------------------------------------------------- /osu-cleaner/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /osu-cleaner/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace osu_cleaner 2 | { 3 | partial class MainApp 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.elementList = new System.Windows.Forms.CheckedListBox(); 32 | this.directoryLabel = new System.Windows.Forms.Label(); 33 | this.directoryPath = new System.Windows.Forms.TextBox(); 34 | this.directorySelectButton = new System.Windows.Forms.Button(); 35 | this.videoDeleteCheckbox = new System.Windows.Forms.CheckBox(); 36 | this.skinDeleteCheckbox = new System.Windows.Forms.CheckBox(); 37 | this.sbDeleteCheckbox = new System.Windows.Forms.CheckBox(); 38 | this.deleteButton = new System.Windows.Forms.Button(); 39 | this.findButton = new System.Windows.Forms.Button(); 40 | this.DeletePermanentlyCheckbox = new System.Windows.Forms.CheckBox(); 41 | this.selectAllButton = new System.Windows.Forms.Button(); 42 | this.deselectAllButton = new System.Windows.Forms.Button(); 43 | this.filesSizeLabel = new System.Windows.Forms.Label(); 44 | this.forRemovalSizeLabel = new System.Windows.Forms.Label(); 45 | this.backgroundDeleteCheckbox = new System.Windows.Forms.CheckBox(); 46 | this.moveCheckBox = new System.Windows.Forms.CheckBox(); 47 | this.hitSoundsDeleteCheckbox = new System.Windows.Forms.CheckBox(); 48 | this.FindProgressBar = new System.Windows.Forms.ProgressBar(); 49 | this.cancelButton = new System.Windows.Forms.Button(); 50 | this.SuspendLayout(); 51 | // 52 | // elementList 53 | // 54 | this.elementList.CheckOnClick = true; 55 | this.elementList.FormattingEnabled = true; 56 | this.elementList.Location = new System.Drawing.Point(9, 201); 57 | this.elementList.Name = "elementList"; 58 | this.elementList.Size = new System.Drawing.Size(728, 304); 59 | this.elementList.TabIndex = 9; 60 | this.elementList.SelectedIndexChanged += new System.EventHandler(this.elementList_SelectedIndexChanged); 61 | // 62 | // directoryLabel 63 | // 64 | this.directoryLabel.Location = new System.Drawing.Point(12, 25); 65 | this.directoryLabel.Name = "directoryLabel"; 66 | this.directoryLabel.Size = new System.Drawing.Size(100, 23); 67 | this.directoryLabel.TabIndex = 8; 68 | this.directoryLabel.Text = "osu! directory path:"; 69 | // 70 | // directoryPath 71 | // 72 | this.directoryPath.Location = new System.Drawing.Point(115, 22); 73 | this.directoryPath.Name = "directoryPath"; 74 | this.directoryPath.Size = new System.Drawing.Size(460, 20); 75 | this.directoryPath.TabIndex = 7; 76 | // 77 | // directorySelectButton 78 | // 79 | this.directorySelectButton.Location = new System.Drawing.Point(581, 20); 80 | this.directorySelectButton.Name = "directorySelectButton"; 81 | this.directorySelectButton.Size = new System.Drawing.Size(75, 23); 82 | this.directorySelectButton.TabIndex = 6; 83 | this.directorySelectButton.Text = "Browse"; 84 | this.directorySelectButton.UseVisualStyleBackColor = true; 85 | this.directorySelectButton.Click += new System.EventHandler(this.directorySelectButton_Click); 86 | // 87 | // videoDeleteCheckbox 88 | // 89 | this.videoDeleteCheckbox.Location = new System.Drawing.Point(12, 51); 90 | this.videoDeleteCheckbox.Name = "videoDeleteCheckbox"; 91 | this.videoDeleteCheckbox.Size = new System.Drawing.Size(133, 24); 92 | this.videoDeleteCheckbox.TabIndex = 5; 93 | this.videoDeleteCheckbox.Text = "Delete video"; 94 | this.videoDeleteCheckbox.UseVisualStyleBackColor = true; 95 | // 96 | // skinDeleteCheckbox 97 | // 98 | this.skinDeleteCheckbox.Location = new System.Drawing.Point(12, 81); 99 | this.skinDeleteCheckbox.Name = "skinDeleteCheckbox"; 100 | this.skinDeleteCheckbox.Size = new System.Drawing.Size(212, 24); 101 | this.skinDeleteCheckbox.TabIndex = 4; 102 | this.skinDeleteCheckbox.Text = "Delete skin elements"; 103 | this.skinDeleteCheckbox.UseVisualStyleBackColor = true; 104 | // 105 | // sbDeleteCheckbox 106 | // 107 | this.sbDeleteCheckbox.Location = new System.Drawing.Point(12, 109); 108 | this.sbDeleteCheckbox.Name = "sbDeleteCheckbox"; 109 | this.sbDeleteCheckbox.Size = new System.Drawing.Size(157, 24); 110 | this.sbDeleteCheckbox.TabIndex = 3; 111 | this.sbDeleteCheckbox.Text = "Delete storyboard elements"; 112 | this.sbDeleteCheckbox.UseVisualStyleBackColor = true; 113 | // 114 | // deleteButton 115 | // 116 | this.deleteButton.Location = new System.Drawing.Point(665, 588); 117 | this.deleteButton.Name = "deleteButton"; 118 | this.deleteButton.Size = new System.Drawing.Size(75, 23); 119 | this.deleteButton.TabIndex = 2; 120 | this.deleteButton.Text = "Delete"; 121 | this.deleteButton.UseVisualStyleBackColor = true; 122 | this.deleteButton.Click += new System.EventHandler(this.deleteButton_Click); 123 | // 124 | // findButton 125 | // 126 | this.findButton.Location = new System.Drawing.Point(581, 158); 127 | this.findButton.Name = "findButton"; 128 | this.findButton.Size = new System.Drawing.Size(75, 23); 129 | this.findButton.TabIndex = 1; 130 | this.findButton.Text = "Find"; 131 | this.findButton.UseVisualStyleBackColor = true; 132 | this.findButton.Click += new System.EventHandler(this.findButton_Click); 133 | // 134 | // DeletePermanentlyCheckbox 135 | // 136 | this.DeletePermanentlyCheckbox.Checked = true; 137 | this.DeletePermanentlyCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; 138 | this.DeletePermanentlyCheckbox.Location = new System.Drawing.Point(12, 583); 139 | this.DeletePermanentlyCheckbox.Name = "DeletePermanentlyCheckbox"; 140 | this.DeletePermanentlyCheckbox.Size = new System.Drawing.Size(281, 24); 141 | this.DeletePermanentlyCheckbox.TabIndex = 0; 142 | this.DeletePermanentlyCheckbox.Text = "Delete permanently instead of moving to Recycle Bin"; 143 | this.DeletePermanentlyCheckbox.UseVisualStyleBackColor = true; 144 | this.DeletePermanentlyCheckbox.CheckedChanged += new System.EventHandler(this.DeletePermanentlyCheckbox_CheckedChanged); 145 | // 146 | // selectAllButton 147 | // 148 | this.selectAllButton.Location = new System.Drawing.Point(584, 554); 149 | this.selectAllButton.Name = "selectAllButton"; 150 | this.selectAllButton.Size = new System.Drawing.Size(75, 23); 151 | this.selectAllButton.TabIndex = 10; 152 | this.selectAllButton.Text = "Select all"; 153 | this.selectAllButton.UseVisualStyleBackColor = true; 154 | this.selectAllButton.Click += new System.EventHandler(this.selectAllButton_Click); 155 | // 156 | // deselectAllButton 157 | // 158 | this.deselectAllButton.Location = new System.Drawing.Point(665, 554); 159 | this.deselectAllButton.Name = "deselectAllButton"; 160 | this.deselectAllButton.Size = new System.Drawing.Size(75, 23); 161 | this.deselectAllButton.TabIndex = 11; 162 | this.deselectAllButton.Text = "Unselect all"; 163 | this.deselectAllButton.UseVisualStyleBackColor = true; 164 | this.deselectAllButton.Click += new System.EventHandler(this.deselectAllButton_Click); 165 | // 166 | // filesSizeLabel 167 | // 168 | this.filesSizeLabel.AutoSize = true; 169 | this.filesSizeLabel.Location = new System.Drawing.Point(9, 554); 170 | this.filesSizeLabel.Name = "filesSizeLabel"; 171 | this.filesSizeLabel.Size = new System.Drawing.Size(68, 13); 172 | this.filesSizeLabel.TabIndex = 12; 173 | this.filesSizeLabel.Text = "Found: 0 MB"; 174 | // 175 | // forRemovalSizeLabel 176 | // 177 | this.forRemovalSizeLabel.AutoSize = true; 178 | this.forRemovalSizeLabel.Location = new System.Drawing.Point(9, 567); 179 | this.forRemovalSizeLabel.Name = "forRemovalSizeLabel"; 180 | this.forRemovalSizeLabel.Size = new System.Drawing.Size(132, 13); 181 | this.forRemovalSizeLabel.TabIndex = 13; 182 | this.forRemovalSizeLabel.Text = "Selected for removal: 0MB"; 183 | // 184 | // backgroundDeleteCheckbox 185 | // 186 | this.backgroundDeleteCheckbox.AutoSize = true; 187 | this.backgroundDeleteCheckbox.Location = new System.Drawing.Point(12, 140); 188 | this.backgroundDeleteCheckbox.Name = "backgroundDeleteCheckbox"; 189 | this.backgroundDeleteCheckbox.Size = new System.Drawing.Size(122, 17); 190 | this.backgroundDeleteCheckbox.TabIndex = 14; 191 | this.backgroundDeleteCheckbox.Text = "Delete backgrounds"; 192 | this.backgroundDeleteCheckbox.UseVisualStyleBackColor = true; 193 | // 194 | // moveCheckBox 195 | // 196 | this.moveCheckBox.AutoSize = true; 197 | this.moveCheckBox.Location = new System.Drawing.Point(12, 611); 198 | this.moveCheckBox.Name = "moveCheckBox"; 199 | this.moveCheckBox.Size = new System.Drawing.Size(206, 17); 200 | this.moveCheckBox.TabIndex = 15; 201 | this.moveCheckBox.Text = "Move to \'Cleaned\' instead of removing"; 202 | this.moveCheckBox.UseVisualStyleBackColor = true; 203 | this.moveCheckBox.CheckedChanged += new System.EventHandler(this.moveCheckBox_CheckedChanged); 204 | // 205 | // hitSoundsDeleteCheckbox 206 | // 207 | this.hitSoundsDeleteCheckbox.AutoSize = true; 208 | this.hitSoundsDeleteCheckbox.Location = new System.Drawing.Point(12, 164); 209 | this.hitSoundsDeleteCheckbox.Name = "hitSoundsDeleteCheckbox"; 210 | this.hitSoundsDeleteCheckbox.Size = new System.Drawing.Size(105, 17); 211 | this.hitSoundsDeleteCheckbox.TabIndex = 16; 212 | this.hitSoundsDeleteCheckbox.Text = "Delete hitsounds"; 213 | this.hitSoundsDeleteCheckbox.UseVisualStyleBackColor = true; 214 | // 215 | // FindProgressBar 216 | // 217 | this.FindProgressBar.Location = new System.Drawing.Point(9, 511); 218 | this.FindProgressBar.Name = "FindProgressBar"; 219 | this.FindProgressBar.Size = new System.Drawing.Size(728, 23); 220 | this.FindProgressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous; 221 | this.FindProgressBar.TabIndex = 17; 222 | this.FindProgressBar.Visible = false; 223 | // 224 | // cancelButton 225 | // 226 | this.cancelButton.Location = new System.Drawing.Point(663, 158); 227 | this.cancelButton.Name = "cancelButton"; 228 | this.cancelButton.Size = new System.Drawing.Size(75, 23); 229 | this.cancelButton.TabIndex = 18; 230 | this.cancelButton.Text = "Cancel"; 231 | this.cancelButton.UseVisualStyleBackColor = true; 232 | this.cancelButton.Visible = false; 233 | this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); 234 | // 235 | // MainApp 236 | // 237 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 238 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 239 | this.ClientSize = new System.Drawing.Size(752, 635); 240 | this.Controls.Add(this.cancelButton); 241 | this.Controls.Add(this.FindProgressBar); 242 | this.Controls.Add(this.hitSoundsDeleteCheckbox); 243 | this.Controls.Add(this.moveCheckBox); 244 | this.Controls.Add(this.backgroundDeleteCheckbox); 245 | this.Controls.Add(this.forRemovalSizeLabel); 246 | this.Controls.Add(this.filesSizeLabel); 247 | this.Controls.Add(this.deselectAllButton); 248 | this.Controls.Add(this.selectAllButton); 249 | this.Controls.Add(this.DeletePermanentlyCheckbox); 250 | this.Controls.Add(this.findButton); 251 | this.Controls.Add(this.deleteButton); 252 | this.Controls.Add(this.sbDeleteCheckbox); 253 | this.Controls.Add(this.skinDeleteCheckbox); 254 | this.Controls.Add(this.videoDeleteCheckbox); 255 | this.Controls.Add(this.directorySelectButton); 256 | this.Controls.Add(this.directoryPath); 257 | this.Controls.Add(this.directoryLabel); 258 | this.Controls.Add(this.elementList); 259 | this.Name = "MainApp"; 260 | this.Text = "osu!Cleaner v1.05"; 261 | this.Load += new System.EventHandler(this.MainApp_Load); 262 | this.ResumeLayout(false); 263 | this.PerformLayout(); 264 | 265 | } 266 | 267 | #endregion 268 | private System.Windows.Forms.Label directoryLabel; 269 | private System.Windows.Forms.TextBox directoryPath; 270 | private System.Windows.Forms.Button directorySelectButton; 271 | private System.Windows.Forms.CheckBox videoDeleteCheckbox; 272 | private System.Windows.Forms.CheckBox skinDeleteCheckbox; 273 | private System.Windows.Forms.CheckBox sbDeleteCheckbox; 274 | private System.Windows.Forms.Button deleteButton; 275 | private System.Windows.Forms.Button findButton; 276 | private System.Windows.Forms.CheckBox DeletePermanentlyCheckbox; 277 | private System.Windows.Forms.CheckedListBox elementList; 278 | private System.Windows.Forms.Button selectAllButton; 279 | private System.Windows.Forms.Button deselectAllButton; 280 | private System.Windows.Forms.Label filesSizeLabel; 281 | private System.Windows.Forms.Label forRemovalSizeLabel; 282 | private System.Windows.Forms.CheckBox backgroundDeleteCheckbox; 283 | private System.Windows.Forms.CheckBox moveCheckBox; 284 | private System.Windows.Forms.CheckBox hitSoundsDeleteCheckbox; 285 | private System.Windows.Forms.ProgressBar FindProgressBar; 286 | private System.Windows.Forms.Button cancelButton; 287 | } 288 | } 289 | 290 | -------------------------------------------------------------------------------- /osu-cleaner/Form1.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * osu-cleaner 3 | * Version: 1.00 4 | * Author: henntix 5 | */ 6 | using System; 7 | using System.Collections.Generic; 8 | using System.ComponentModel; 9 | using System.IO; 10 | using System.Text.RegularExpressions; 11 | using System.Windows.Forms; 12 | using Microsoft.VisualBasic.FileIO; 13 | using Microsoft.Win32; 14 | namespace osu_cleaner 15 | { 16 | public partial class MainApp : Form 17 | { 18 | private List skinElements = new List(); 19 | private List hitSounds = new List(); 20 | BackgroundWorker worker; 21 | private long filesSize = 0; 22 | private long forRemovalSize = 0; 23 | private List foundElements = new List(); 24 | 25 | public MainApp() 26 | { 27 | InitializeComponent(); 28 | } 29 | 30 | private void MainApp_Load(object sender, EventArgs e) 31 | { 32 | directoryPath.Text = getOsuPath(); 33 | setSkinList(); 34 | worker = new BackgroundWorker(); 35 | worker.DoWork += new DoWorkEventHandler(findElements); 36 | worker.ProgressChanged += new ProgressChangedEventHandler(progressBar); 37 | worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(findComplete); 38 | worker.WorkerReportsProgress = true; 39 | worker.WorkerSupportsCancellation = true; 40 | } 41 | 42 | private void directorySelectButton_Click(object sender, EventArgs e) 43 | { 44 | FolderBrowserDialog folder = new FolderBrowserDialog(); 45 | folder.ShowNewFolderButton = false; 46 | folder.RootFolder = Environment.SpecialFolder.MyComputer; 47 | folder.Description = "Select an osu! root directory:"; 48 | folder.SelectedPath = directoryPath.Text; 49 | DialogResult path = folder.ShowDialog(); 50 | if (path == DialogResult.OK) 51 | { 52 | //check if osu!.exe is present 53 | if (!File.Exists(folder.SelectedPath + "\\osu!.exe")) 54 | { 55 | MessageBox.Show("Not a valid osu! directory!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 56 | directorySelectButton_Click(sender, e); 57 | return; 58 | } 59 | } 60 | directoryPath.Text = folder.SelectedPath + "\\"; 61 | } 62 | 63 | private void findButton_Click(object sender, EventArgs e) 64 | { 65 | FindProgressBar.Visible = true; 66 | cancelButton.Visible = true; 67 | elementList.Items.Clear(); 68 | filesSize = 0; 69 | filesSizeLabel.Text = "Found: " + Math.Round((double)(filesSize) / 1048576, 4) + " MB"; 70 | forRemovalSize = 0; 71 | forRemovalSizeLabel.Text = "Selected for removal: " + Math.Round((double)(forRemovalSize) / 1048576, 4) + " MB"; 72 | worker.RunWorkerAsync(); 73 | } 74 | 75 | private void cancelButton_Click(object sender, EventArgs e) 76 | { 77 | if (worker.IsBusy) 78 | worker.CancelAsync(); 79 | } 80 | 81 | private void deleteButton_Click(object sender, EventArgs e) 82 | { 83 | List delete = new List(); 84 | foreach (string file in elementList.CheckedItems)//adding items to temporary collection to let me delete items from on-screen list 85 | delete.Add(file); 86 | if (moveCheckBox.Checked) Directory.CreateDirectory(directoryPath.Text + "Cleaned"); 87 | 88 | foreach (string file in delete) 89 | { 90 | try 91 | { 92 | filesSize -= getFileSize(file); 93 | if (DeletePermanentlyCheckbox.Checked) FileSystem.DeleteFile(file, UIOption.OnlyErrorDialogs, RecycleOption.DeletePermanently); 94 | else if (moveCheckBox.Checked) 95 | { 96 | FileInfo fileInfo = new FileInfo(file); 97 | string relativePath = fileInfo.Directory.FullName.Replace(directoryPath.Text + "Songs", directoryPath.Text + "Cleaned\\"); 98 | if (!Directory.Exists(relativePath)) 99 | Directory.CreateDirectory(relativePath); 100 | File.Move(file, relativePath + "\\" + fileInfo.Name); 101 | } 102 | else FileSystem.DeleteFile(file, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin); 103 | } 104 | catch (FileNotFoundException) { } 105 | catch (NotSupportedException) { } 106 | 107 | elementList.Items.Remove(file); 108 | filesSizeLabel.Text = "Found: " + Math.Round((double)(filesSize) / 1048576, 4) + " MB"; 109 | } 110 | } 111 | 112 | private void selectAllButton_Click(object sender, EventArgs e) 113 | { 114 | for (int i = 0; i < elementList.Items.Count; i++) 115 | elementList.SetItemChecked(i, true); 116 | forRemovalSize = 0; 117 | foreach (string file in elementList.CheckedItems) 118 | { 119 | FileInfo sizeInfo = new FileInfo(file); 120 | forRemovalSize += sizeInfo.Length; 121 | } 122 | forRemovalSizeLabel.Text = "Selected for removal: " + Math.Round((double)(forRemovalSize) / 1048576, 4) + " MB"; 123 | } 124 | 125 | private void deselectAllButton_Click(object sender, EventArgs e) 126 | { 127 | for (int i = 0; i < elementList.Items.Count; i++) 128 | elementList.SetItemChecked(i, false); 129 | forRemovalSize = 0; 130 | forRemovalSizeLabel.Text = "Selected for removal: " + Math.Round((double)(forRemovalSize) / 1048576, 4) + " MB"; 131 | } 132 | 133 | private void elementList_SelectedIndexChanged(object sender, EventArgs e) 134 | { 135 | forRemovalSize = 0; 136 | foreach (string file in elementList.CheckedItems) 137 | { 138 | FileInfo sizeInfo = new FileInfo(file); 139 | forRemovalSize += sizeInfo.Length; 140 | } 141 | forRemovalSizeLabel.Text = "Selected for removal: " + Math.Round((double)(forRemovalSize) / 1048576, 4) + " MB"; 142 | } 143 | 144 | private void DeletePermanentlyCheckbox_CheckedChanged(object sender, EventArgs e) 145 | { 146 | if(DeletePermanentlyCheckbox.Checked) moveCheckBox.Checked = false; 147 | } 148 | 149 | private void moveCheckBox_CheckedChanged(object sender, EventArgs e) 150 | { 151 | if(moveCheckBox.Checked) DeletePermanentlyCheckbox.Checked = false; 152 | if (moveCheckBox.Checked) deleteButton.Text = "Move"; 153 | else deleteButton.Text = "Delete"; 154 | } 155 | 156 | private bool RegexMatch(string str, string regex) 157 | { 158 | Regex r = new Regex(regex); 159 | return r.IsMatch(str); 160 | } 161 | 162 | private void findElements(object sender, DoWorkEventArgs e) 163 | { 164 | int folderCount = Directory.GetDirectories(directoryPath.Text + "Songs").Length; 165 | Console.WriteLine(folderCount); 166 | int current = 0; 167 | foreach (string d in Directory.GetDirectories(directoryPath.Text + "Songs")) 168 | { 169 | if (sbDeleteCheckbox.Checked) 170 | { 171 | //whitelisting BG from deletion (often BG files are used in SB) 172 | List whitelist = new List(); 173 | foreach (string file in Directory.GetFiles(d)) 174 | if (Regex.IsMatch(file, "osu$")) 175 | { 176 | string bg = getBGPath(file); 177 | if (bg != null && !whitelist.Contains(bg)) 178 | whitelist.Add(bg); 179 | } 180 | 181 | foreach (string file in Directory.GetFiles(d)) 182 | { 183 | if (Regex.IsMatch(file, "osb$")) 184 | { 185 | List sbElements = getSBElements(file); 186 | foreach (string sbElement in sbElements) 187 | { 188 | if (!whitelist.Contains(sbElement)) 189 | { 190 | long size = getFileSize(d + sbElement); 191 | if (size != 0) 192 | { 193 | foundElements.Add(d + sbElement); 194 | filesSize += size; 195 | } 196 | } 197 | } 198 | } 199 | } 200 | } 201 | 202 | if (backgroundDeleteCheckbox.Checked) 203 | { 204 | List bgElements = new List(); 205 | foreach (string file in Directory.GetFiles(d)) 206 | if (Regex.IsMatch(file, "osu$")) 207 | { 208 | string bg = getBGPath(file); 209 | if (bg != null && !bgElements.Contains(bg)) 210 | { 211 | long size = getFileSize(d + bg); 212 | if (size != 0) 213 | { 214 | bgElements.Add(bg); 215 | foundElements.Add(d + bg); 216 | filesSize += size; 217 | } 218 | } 219 | } 220 | } 221 | 222 | foreach (string file in Directory.GetFiles(d)) 223 | { 224 | if (videoDeleteCheckbox.Checked) 225 | if (RegexMatch(file, "avi$") || RegexMatch(file, "flv$")) 226 | { 227 | foundElements.Add(file); 228 | filesSize += getFileSize(file); 229 | } 230 | if (skinDeleteCheckbox.Checked) 231 | { 232 | foreach (string regex in skinElements) 233 | if (RegexMatch(file, regex)) 234 | { 235 | foundElements.Add(file); 236 | filesSize += getFileSize(file); 237 | } 238 | } 239 | if (hitSoundsDeleteCheckbox.Checked) 240 | { 241 | 242 | if (RegexMatch(file, "\\\\drum-") || RegexMatch(file, "\\\\normal-") || RegexMatch(file, "\\\\soft-")) 243 | { 244 | foundElements.Add(file); 245 | filesSize += getFileSize(file); 246 | } 247 | } 248 | } 249 | if (worker.CancellationPending) return; 250 | current++; 251 | worker.ReportProgress((int)((double)current / folderCount * 100)); 252 | } 253 | worker.ReportProgress(100); 254 | } 255 | 256 | private void progressBar(object sender, ProgressChangedEventArgs e) 257 | { 258 | FindProgressBar.Value = e.ProgressPercentage; 259 | filesSizeLabel.Text = "Found: " + Math.Round((double)(filesSize) / 1048576, 4) + " MB"; 260 | } 261 | 262 | private void findComplete(object sender, RunWorkerCompletedEventArgs e) 263 | { 264 | foreach (string file in foundElements) 265 | elementList.Items.Add(file); 266 | filesSizeLabel.Text = "Found: " + Math.Round((double)(filesSize) / 1048576, 4) + " MB"; 267 | foundElements.Clear(); 268 | FindProgressBar.Visible = false; 269 | cancelButton.Visible = false; 270 | FindProgressBar.Value = 0; 271 | } 272 | 273 | private string getOsuPath() 274 | { 275 | using (RegistryKey osureg = Registry.ClassesRoot.OpenSubKey("osu\\DefaultIcon")) 276 | { 277 | if (osureg != null) 278 | { 279 | string osukey = osureg.GetValue(null).ToString(); 280 | string osupath = osukey.Remove(0, 1); 281 | osupath = osupath.Remove(osupath.Length - 11); 282 | return osupath; 283 | } 284 | else return ""; 285 | } 286 | } 287 | 288 | private string getBGPath(string path) 289 | { 290 | using (StreamReader file = File.OpenText(path)) 291 | { 292 | string line; 293 | while ((line = file.ReadLine()) != null) 294 | { 295 | if (Regex.IsMatch(line, "^//Background and Video events")) 296 | { 297 | line = file.ReadLine(); 298 | string[] items = line.Split(','); 299 | if (items[0] == "0") 300 | { 301 | string tmp = "\\" + items[2].Replace("\"", string.Empty); 302 | return tmp; 303 | } 304 | } 305 | } 306 | return null; 307 | } 308 | } 309 | 310 | private List getSBElements(string file) 311 | { 312 | List sbElements = new List(); 313 | using (StreamReader sbFile = File.OpenText(file)) 314 | { 315 | string line; 316 | while ((line = sbFile.ReadLine()) != null) 317 | { 318 | string[] items = line.Split(','); 319 | if (items[0] == "Sprite") 320 | { 321 | string tmp = "\\" + items[3].Replace("\"", string.Empty); 322 | tmp = tmp.Replace("/", "\\"); 323 | if (!sbElements.Contains(tmp)) 324 | sbElements.Add(tmp); 325 | } 326 | } 327 | } 328 | return sbElements; 329 | } 330 | 331 | private long getFileSize(string path) 332 | { 333 | try 334 | { 335 | FileInfo sizeInfo = new FileInfo(path); 336 | return sizeInfo.Length; 337 | } 338 | catch (FileNotFoundException) 339 | { 340 | return 0; 341 | } 342 | catch (NotSupportedException) 343 | { 344 | return 0; 345 | } 346 | } 347 | 348 | private void setSkinList() 349 | { 350 | skinElements.Add("\\\\applause"); ; 351 | skinElements.Add("\\\\approachcircle"); ; 352 | skinElements.Add("\\\\button-"); ; 353 | skinElements.Add("\\\\combobreak"); 354 | skinElements.Add("\\\\comboburst"); 355 | skinElements.Add("\\\\count"); 356 | skinElements.Add("\\\\cursor"); 357 | skinElements.Add("\\\\default-"); 358 | skinElements.Add("\\\\failsound"); 359 | skinElements.Add("\\\\followpoint"); 360 | skinElements.Add("\\\\fruit-"); 361 | skinElements.Add("\\\\go\\.png"); 362 | skinElements.Add("\\\\go@2x\\.png"); 363 | skinElements.Add("\\\\gos\\.png"); 364 | skinElements.Add("\\\\gos@2x\\.png"); 365 | skinElements.Add("\\\\hit0"); 366 | skinElements.Add("\\\\hit100"); 367 | skinElements.Add("\\\\hit300"); 368 | skinElements.Add("\\\\hit50"); 369 | skinElements.Add("\\\\hitcircle"); 370 | skinElements.Add("\\\\inputoverlay-"); 371 | skinElements.Add("\\\\lighting\\.png"); 372 | skinElements.Add("\\\\lighting@2x\\.png"); 373 | skinElements.Add("\\\\mania-"); 374 | skinElements.Add("\\\\menu\\."); 375 | skinElements.Add("\\\\menu-back"); 376 | skinElements.Add("\\\\particle100"); 377 | skinElements.Add("\\\\particle300"); 378 | skinElements.Add("\\\\particle50"); 379 | skinElements.Add("\\\\pause-"); 380 | skinElements.Add("\\\\pippidon"); 381 | skinElements.Add("\\\\play-"); 382 | skinElements.Add("\\\\ranking-"); 383 | skinElements.Add("\\\\ready"); 384 | skinElements.Add("\\\\reversearrow"); 385 | skinElements.Add("\\\\score-"); 386 | skinElements.Add("\\\\scorebar-"); 387 | skinElements.Add("\\\\sectionfail"); 388 | skinElements.Add("\\\\sectionpass"); 389 | skinElements.Add("\\\\section-"); 390 | skinElements.Add("\\\\selection-"); 391 | skinElements.Add("\\\\sliderb"); 392 | skinElements.Add("\\\\sliderfollowcircle"); 393 | skinElements.Add("\\\\sliderscorepoint"); 394 | skinElements.Add("\\\\spinnerbonus"); 395 | skinElements.Add("\\\\spinner-"); 396 | skinElements.Add("\\\\spinnerspin"); 397 | skinElements.Add("\\\\star\\.png"); 398 | skinElements.Add("\\\\star@2x\\.png"); 399 | skinElements.Add("\\\\star2\\.png"); 400 | skinElements.Add("\\\\star2@2x\\.png"); 401 | skinElements.Add("\\\\taiko-"); 402 | skinElements.Add("\\\\taikobigcircle"); 403 | skinElements.Add("\\\\taikohitcircle"); 404 | } 405 | } 406 | } 407 | -------------------------------------------------------------------------------- /osu-cleaner/Form1.en.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | 164, 17 123 | 124 | 125 | Delete skin elements (TODO) 126 | 127 | 128 | 194, 17 129 | 130 | 131 | Delete storyboard elements (TODO) 132 | 133 | -------------------------------------------------------------------------------- /osu-cleaner/Form1.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /osu-cleaner/Program.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * osu-cleaner 3 | * Version: 1.0 4 | * Author: henntix 5 | * License: The MIT License (MIT) 6 | */ 7 | using System; 8 | using System.Collections.Generic; 9 | using System.Linq; 10 | using System.Threading.Tasks; 11 | using System.Windows.Forms; 12 | 13 | namespace osu_cleaner 14 | { 15 | static class Program 16 | { 17 | /// 18 | /// The main entry point for the application. 19 | /// 20 | [STAThread] 21 | static void Main() 22 | { 23 | Application.EnableVisualStyles(); 24 | Application.SetCompatibleTextRenderingDefault(false); 25 | Application.Run(new MainApp()); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /osu-cleaner/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("osu-cleaner")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("osu-cleaner")] 13 | [assembly: AssemblyCopyright("Copyright © 2016")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("d2107d30-b652-464a-aaec-30f7fd6cac85")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /osu-cleaner/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace osu_cleaner.Properties 12 | { 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources 26 | { 27 | 28 | private static global::System.Resources.ResourceManager resourceMan; 29 | 30 | private static global::System.Globalization.CultureInfo resourceCulture; 31 | 32 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 33 | internal Resources() 34 | { 35 | } 36 | 37 | /// 38 | /// Returns the cached ResourceManager instance used by this class. 39 | /// 40 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 41 | internal static global::System.Resources.ResourceManager ResourceManager 42 | { 43 | get 44 | { 45 | if ((resourceMan == null)) 46 | { 47 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("osu_cleaner.Properties.Resources", typeof(Resources).Assembly); 48 | resourceMan = temp; 49 | } 50 | return resourceMan; 51 | } 52 | } 53 | 54 | /// 55 | /// Overrides the current thread's CurrentUICulture property for all 56 | /// resource lookups using this strongly typed resource class. 57 | /// 58 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 59 | internal static global::System.Globalization.CultureInfo Culture 60 | { 61 | get 62 | { 63 | return resourceCulture; 64 | } 65 | set 66 | { 67 | resourceCulture = value; 68 | } 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /osu-cleaner/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /osu-cleaner/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace osu_cleaner.Properties 12 | { 13 | 14 | 15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] 17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase 18 | { 19 | 20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 21 | 22 | public static Settings Default 23 | { 24 | get 25 | { 26 | return defaultInstance; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /osu-cleaner/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /osu-cleaner/osu-cleaner.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {D2107D30-B652-464A-AAEC-30F7FD6CAC85} 8 | WinExe 9 | Properties 10 | osu_cleaner 11 | osu-cleaner 12 | v4.5.2 13 | 512 14 | true 15 | 16 | 17 | AnyCPU 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | AnyCPU 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | Form 52 | 53 | 54 | Form1.cs 55 | 56 | 57 | 58 | 59 | Form1.cs 60 | 61 | 62 | ResXFileCodeGenerator 63 | Resources.Designer.cs 64 | Designer 65 | 66 | 67 | True 68 | Resources.resx 69 | 70 | 71 | SettingsSingleFileGenerator 72 | Settings.Designer.cs 73 | 74 | 75 | True 76 | Settings.settings 77 | True 78 | 79 | 80 | 81 | 82 | 83 | 84 | 91 | -------------------------------------------------------------------------------- /osu-cleaner/osu-cleaner.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.23107.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu-cleaner", "osu-cleaner.csproj", "{D2107D30-B652-464A-AAEC-30F7FD6CAC85}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {D2107D30-B652-464A-AAEC-30F7FD6CAC85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {D2107D30-B652-464A-AAEC-30F7FD6CAC85}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {D2107D30-B652-464A-AAEC-30F7FD6CAC85}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {D2107D30-B652-464A-AAEC-30F7FD6CAC85}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | --------------------------------------------------------------------------------