diff --git a/branches/1stNUP_for_2ndNUP/sources/ConsoleBackup/SavedataChecker.cpp b/branches/1stNUP_for_2ndNUP/sources/ConsoleBackup/SavedataChecker.cpp index 511c40d..5dbada1 100644 --- a/branches/1stNUP_for_2ndNUP/sources/ConsoleBackup/SavedataChecker.cpp +++ b/branches/1stNUP_for_2ndNUP/sources/ConsoleBackup/SavedataChecker.cpp @@ -35,7 +35,7 @@ SavedataCheckerBase::~SavedataCheckerBase() NN_LOG("m_TotalReadSize = %lld\n", m_TotalReadSize); } -nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::string baseName, +nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* metaDataCrashed, bool* modified, std::string baseName, std::wstring currentDirectory, bool erase) { nn::fs::Directory dir; @@ -52,11 +52,7 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::str COMMON_LOGGER_RESULT_IF_FAILED(result); if (erase) { - COMMON_LOGGER_WARN( - "Deleting: %s%/s\n", baseName.c_str(), common::GetCharStr(GetFilePathWithoutArchive(currentDirectory).c_str())); - result = nn::fs::TryDeleteDirectory(currentDirectory.c_str()); - COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); - *modified = true; + *metaDataCrashed = true; } return result; } @@ -74,11 +70,7 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::str COMMON_LOGGER_RESULT_IF_FAILED(result); if (erase) { - COMMON_LOGGER_WARN( - "Deleting: %s/%s\n", baseName.c_str(), common::GetCharStr(GetFilePathWithoutArchive(currentDirectory).c_str())); - result = nn::fs::TryDeleteDirectoryRecursively(currentDirectory.c_str()); - COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); - *modified = true; + *metaDataCrashed = true; } // ディレクトリの読み取りエラーなので再度読み取ってもエラーになる return result; @@ -99,7 +91,7 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::str // ディレクトリの場合 if (entry.attributes.isDirectory) { - result = CleanUpFilesRecursively(modified, baseName, + result = CleanUpFilesRecursively(metaDataCrashed, modified, baseName, currentDirectory + std::wstring(entry.entryName) + std::wstring(L"/"), erase); if(erase && result.IsFailure()) { @@ -292,10 +284,12 @@ nn::Result SystemSavedataChecker::CleanUp(bool erase) { nn::Result result; - bool modified = false; std::wstring currentDirectory; for (s32 i = 0; i < SYSTEM_SAVE_DATA_NUM; i++) { + bool metaDataCrashed = false; + bool modified = false; + // SPIDERのスキップ if(SYSTEM_SAVEDATA_COUPLE_LIST[i].id == 0x00020088 || SYSTEM_SAVEDATA_COUPLE_LIST[i].id == 0x0002009d || @@ -328,7 +322,18 @@ nn::Result SystemSavedataChecker::CleanUp(bool erase) { NN_LOG("Mount %s\n", SYSTEM_SAVEDATA_COUPLE_LIST[i].name.c_str()); // ファイルを個別にチェックする - result = CleanUpFilesRecursively(&modified, SYSTEM_SAVEDATA_COUPLE_LIST[i].name.c_str(), L"ssave:/", erase); + result = CleanUpFilesRecursively(&metaDataCrashed, &modified, SYSTEM_SAVEDATA_COUPLE_LIST[i].name.c_str(), L"ssave:/", erase); + // メタデータエラーの場合は一旦アンマウントしてからアーカイブごと削除 + if (erase && metaDataCrashed) + { + // 削除する + COMMON_LOGGER_WARN( "Deleting: %s/\n", SYSTEM_SAVEDATA_COUPLE_LIST[i].name.c_str()); + result = nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); + result = nn::fs::DeleteSystemSaveData(SYSTEM_SAVEDATA_COUPLE_LIST[i].id); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); + continue; + } COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); if(modified) @@ -392,9 +397,11 @@ nn::Result SharedExtSavedataChecker::CleanUp(bool erase) COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); NN_LOG_DEBUG("ExtData num = %d\n", numId); - bool modified = false; for (s32 i = 0; i < numId; i++ ) { + bool metaDataCrashed = false; + bool modified = false; + char baseName[10]; nn::nstd::TSNPrintf(baseName, sizeof(baseName), "%X", IdArray[i]); result = nn::fs::MountSharedExtSaveData(SHARED_EXT_SAVEDATA_ARCHIVE_NAME, IdArray[i]); @@ -403,7 +410,17 @@ nn::Result SharedExtSavedataChecker::CleanUp(bool erase) NN_LOG("Mount %x\n", IdArray[i]); // アーカイブ内のファイル・ディレクトリをチェックする - result = CleanUpFilesRecursively(&modified, baseName, L"shext:/", erase); + result = CleanUpFilesRecursively(&metaDataCrashed, &modified, baseName, L"shext:/", erase); + // メタデータが壊れていた場合はアンマウントしてから削除する + if(erase && metaDataCrashed) + { + COMMON_LOGGER_WARN("Deleting %x/\n", IdArray[i]); + result = nn::fs::Unmount(SHARED_EXT_SAVEDATA_ARCHIVE_NAME); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); + result = nn::fs::DeleteSharedExtSaveData(IdArray[i]); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); + continue; + } COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); result = nn::fs::Unmount(SHARED_EXT_SAVEDATA_ARCHIVE_NAME); diff --git a/branches/1stNUP_for_2ndNUP/sources/ConsoleBackup/SavedataChecker.h b/branches/1stNUP_for_2ndNUP/sources/ConsoleBackup/SavedataChecker.h index 041ee6a..c9a5a30 100644 --- a/branches/1stNUP_for_2ndNUP/sources/ConsoleBackup/SavedataChecker.h +++ b/branches/1stNUP_for_2ndNUP/sources/ConsoleBackup/SavedataChecker.h @@ -139,11 +139,12 @@ public: protected: //! @brief ファイルとディレクトリを再帰的にチェックする。エラーがあれば削除する + //! @param[out] metaDataCrashed メタデータが壊れていたかどうか。アーカイブごと削除するかどうかの判断に使用する //! @param[out] modified ファイルかディレクトリを削除したかどうか。Commitするかどうかの判断に使用する //! @param[in] baseName 削除するセーブデータの区別に表示するための名前 //! @param[in] currentDirectory チェックを開始するディレクトリ。スラッシュで終端すること //! @param[in] erase ファイルかディレクトリを削除するかどうか - nn::Result CleanUpFilesRecursively(bool* modified, std::string baseName, std::wstring currentDirectory, + nn::Result CleanUpFilesRecursively(bool* metaDataCrashed, bool* modified, std::string baseName, std::wstring currentDirectory, bool erase); //! @brief ファイルサイズを取得する