diff --git a/Source/Core/Core/HW/GCMemcard/GCMemcardUtils.cpp b/Source/Core/Core/HW/GCMemcard/GCMemcardUtils.cpp index fa061fc891..67af234b89 100644 --- a/Source/Core/Core/HW/GCMemcard/GCMemcardUtils.cpp +++ b/Source/Core/Core/HW/GCMemcard/GCMemcardUtils.cpp @@ -72,6 +72,19 @@ bool HasSameIdentity(const DEntry& lhs, const DEntry& rhs) return true; } +bool HasDuplicateIdentity(const std::vector& savefiles) +{ + for (size_t i = 0; i < savefiles.size(); ++i) + { + for (size_t j = i + 1; j < savefiles.size(); ++j) + { + if (HasSameIdentity(savefiles[i].dir_entry, savefiles[j].dir_entry)) + return true; + } + } + return false; +} + static void ByteswapDEntrySavHeader(std::array& entry) { // several bytes in SAV are swapped compared to the internal memory card format diff --git a/Source/Core/Core/HW/GCMemcard/GCMemcardUtils.h b/Source/Core/Core/HW/GCMemcard/GCMemcardUtils.h index 2a73c2de91..0178feca42 100644 --- a/Source/Core/Core/HW/GCMemcard/GCMemcardUtils.h +++ b/Source/Core/Core/HW/GCMemcard/GCMemcardUtils.h @@ -13,6 +13,9 @@ namespace Memcard { bool HasSameIdentity(const DEntry& lhs, const DEntry& rhs); +// Check if any two given savefiles have the same identity. +bool HasDuplicateIdentity(const std::vector& savefiles); + enum class ReadSavefileErrorCode { OpenFileFail, diff --git a/Source/Core/DolphinQt/GCMemcardManager.cpp b/Source/Core/DolphinQt/GCMemcardManager.cpp index 97176baf62..e8a4e2edd5 100644 --- a/Source/Core/DolphinQt/GCMemcardManager.cpp +++ b/Source/Core/DolphinQt/GCMemcardManager.cpp @@ -515,6 +515,12 @@ void GCMemcardManager::ImportFiles(int slot, const std::vector(number_of_blocks))); } + if (Memcard::HasDuplicateIdentity(savefiles)) + { + error_messages.push_back( + tr("At least two of the selected save files have the same internal filename.")); + } + for (const Memcard::Savefile& savefile : savefiles) { if (card->TitlePresent(savefile.dir_entry))