├── .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 |
--------------------------------------------------------------------------------