diff --git a/osu.Game.Tests/Database/LegacyExporterTest.cs b/osu.Game.Tests/Database/LegacyExporterTest.cs
index c9aea80585..d41b3a5017 100644
--- a/osu.Game.Tests/Database/LegacyExporterTest.cs
+++ b/osu.Game.Tests/Database/LegacyExporterTest.cs
@@ -46,7 +46,7 @@ namespace osu.Game.Tests.Database
Assert.That(item.Filename.Length, Is.LessThan(TestLegacyExporter.MAX_FILENAME_LENGTH));
//Export multiple times
- for (int i = 0; i < 10; i++)
+ for (int i = 0; i < 100; i++)
{
string expectedFileName = i == 0 ? short_filename : $"{short_filename} ({i})";
exportItemAndAssert(item, expectedFileName);
@@ -76,8 +76,11 @@ namespace osu.Game.Tests.Database
Assert.That(item.Filename.Length, Is.GreaterThan(TestLegacyExporter.MAX_FILENAME_LENGTH));
//Export multiple times
- for (int i = 0; i < 10; i++)
- exportItemAndAssert(item, expectedName);
+ for (int i = 0; i < 100; i++)
+ {
+ string expectedFilename = i == 0 ? expectedName : $"{expectedName} ({i})";
+ exportItemAndAssert(item, expectedFilename);
+ }
}
private void exportItemAndAssert(IHasNamedFiles item, string expectedName)
diff --git a/osu.Game/Database/LegacyExporter.cs b/osu.Game/Database/LegacyExporter.cs
index cf88efb151..0fa7b9e03c 100644
--- a/osu.Game/Database/LegacyExporter.cs
+++ b/osu.Game/Database/LegacyExporter.cs
@@ -31,7 +31,7 @@ namespace osu.Game.Database
/// For more information see file specification syntax, file systems limitations
///
///
- public const int MAX_FILENAME_LENGTH = 255 - (32 + 4 + 2); //max path - (Guid + Guid "D" format chars + Storage.CreateFileSafely chars)
+ public const int MAX_FILENAME_LENGTH = 255 - (32 + 4 + 2 + 5); //max path - (Guid + Guid "D" format chars + Storage.CreateFileSafely chars + account for ' (99)' suffix)
///
/// The file extension for exports (including the leading '.').
@@ -48,7 +48,15 @@ namespace osu.Game.Database
UserFileStorage = storage.GetStorageForDirectory(@"files");
}
- protected virtual string GetFilename(TModel item) => item.GetDisplayString();
+ protected virtual string GetFilename(TModel item)
+ {
+ string filename = item.GetDisplayString();
+
+ if (filename.Length > MAX_FILENAME_LENGTH - FileExtension.Length)
+ return filename.Remove(MAX_FILENAME_LENGTH - FileExtension.Length);
+
+ return filename;
+ }
///
/// Exports an item to a legacy (.zip based) package.
@@ -65,14 +73,6 @@ namespace osu.Game.Database
string filename = NamingUtils.GetNextBestFilename(existingExports, $"{itemFilename}{FileExtension}");
- if (filename.Length > MAX_FILENAME_LENGTH)
- {
- string filenameWithoutExtension = Path.GetFileNameWithoutExtension(filename);
-
- filenameWithoutExtension = filenameWithoutExtension.Remove(MAX_FILENAME_LENGTH - FileExtension.Length);
- filename = $"{filenameWithoutExtension}{FileExtension}";
- }
-
using (var stream = exportStorage.CreateFileSafely(filename))
ExportModelTo(item, stream);