mirror of
https://github.com/rvtr/ctr_Repair.git
synced 2025-10-31 13:51:08 -04:00
trunk r505のマージ
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@507 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
parent
99a7305dfa
commit
31a210c020
@ -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);
|
||||
|
||||
@ -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 ファイルサイズを取得する
|
||||
|
||||
Loading…
Reference in New Issue
Block a user