mirror of
https://github.com/rvtr/ctr_Repair.git
synced 2025-10-31 13:51:08 -04:00
ディレクトリ検証エラーの場合はアーカイブごと削除するように
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@505 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
parent
f4b4b940eb
commit
8c4e5039a1
@ -35,7 +35,7 @@ SavedataCheckerBase::~SavedataCheckerBase()
|
|||||||
NN_LOG("m_TotalReadSize = %lld\n", m_TotalReadSize);
|
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)
|
std::wstring currentDirectory, bool erase)
|
||||||
{
|
{
|
||||||
nn::fs::Directory dir;
|
nn::fs::Directory dir;
|
||||||
@ -52,11 +52,7 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::str
|
|||||||
COMMON_LOGGER_RESULT_IF_FAILED(result);
|
COMMON_LOGGER_RESULT_IF_FAILED(result);
|
||||||
if (erase)
|
if (erase)
|
||||||
{
|
{
|
||||||
COMMON_LOGGER_WARN(
|
*metaDataCrashed = true;
|
||||||
"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;
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -74,11 +70,7 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::str
|
|||||||
COMMON_LOGGER_RESULT_IF_FAILED(result);
|
COMMON_LOGGER_RESULT_IF_FAILED(result);
|
||||||
if (erase)
|
if (erase)
|
||||||
{
|
{
|
||||||
COMMON_LOGGER_WARN(
|
*metaDataCrashed = true;
|
||||||
"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;
|
|
||||||
}
|
}
|
||||||
// ディレクトリの読み取りエラーなので再度読み取ってもエラーになる
|
// ディレクトリの読み取りエラーなので再度読み取ってもエラーになる
|
||||||
return result;
|
return result;
|
||||||
@ -99,7 +91,7 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::str
|
|||||||
// ディレクトリの場合
|
// ディレクトリの場合
|
||||||
if (entry.attributes.isDirectory)
|
if (entry.attributes.isDirectory)
|
||||||
{
|
{
|
||||||
result = CleanUpFilesRecursively(modified, baseName,
|
result = CleanUpFilesRecursively(metaDataCrashed, modified, baseName,
|
||||||
currentDirectory + std::wstring(entry.entryName) + std::wstring(L"/"), erase);
|
currentDirectory + std::wstring(entry.entryName) + std::wstring(L"/"), erase);
|
||||||
if(erase && result.IsFailure())
|
if(erase && result.IsFailure())
|
||||||
{
|
{
|
||||||
@ -292,10 +284,12 @@ nn::Result SystemSavedataChecker::CleanUp(bool erase)
|
|||||||
{
|
{
|
||||||
nn::Result result;
|
nn::Result result;
|
||||||
|
|
||||||
bool modified = false;
|
|
||||||
std::wstring currentDirectory;
|
std::wstring currentDirectory;
|
||||||
for (s32 i = 0; i < SYSTEM_SAVE_DATA_NUM; i++)
|
for (s32 i = 0; i < SYSTEM_SAVE_DATA_NUM; i++)
|
||||||
{
|
{
|
||||||
|
bool metaDataCrashed = false;
|
||||||
|
bool modified = false;
|
||||||
|
|
||||||
// SPIDERのスキップ
|
// SPIDERのスキップ
|
||||||
if(SYSTEM_SAVEDATA_COUPLE_LIST[i].id == 0x00020088 ||
|
if(SYSTEM_SAVEDATA_COUPLE_LIST[i].id == 0x00020088 ||
|
||||||
SYSTEM_SAVEDATA_COUPLE_LIST[i].id == 0x0002009d ||
|
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());
|
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);
|
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
|
||||||
|
|
||||||
if(modified)
|
if(modified)
|
||||||
@ -392,9 +397,11 @@ nn::Result SharedExtSavedataChecker::CleanUp(bool erase)
|
|||||||
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
|
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
|
||||||
|
|
||||||
NN_LOG_DEBUG("ExtData num = %d\n", numId);
|
NN_LOG_DEBUG("ExtData num = %d\n", numId);
|
||||||
bool modified = false;
|
|
||||||
for (s32 i = 0; i < numId; i++ )
|
for (s32 i = 0; i < numId; i++ )
|
||||||
{
|
{
|
||||||
|
bool metaDataCrashed = false;
|
||||||
|
bool modified = false;
|
||||||
|
|
||||||
char baseName[10];
|
char baseName[10];
|
||||||
nn::nstd::TSNPrintf(baseName, sizeof(baseName), "%X", IdArray[i]);
|
nn::nstd::TSNPrintf(baseName, sizeof(baseName), "%X", IdArray[i]);
|
||||||
result = nn::fs::MountSharedExtSaveData(SHARED_EXT_SAVEDATA_ARCHIVE_NAME, 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]);
|
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);
|
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
|
||||||
|
|
||||||
result = nn::fs::Unmount(SHARED_EXT_SAVEDATA_ARCHIVE_NAME);
|
result = nn::fs::Unmount(SHARED_EXT_SAVEDATA_ARCHIVE_NAME);
|
||||||
|
|||||||
@ -139,11 +139,12 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
//! @brief ファイルとディレクトリを再帰的にチェックする。エラーがあれば削除する
|
//! @brief ファイルとディレクトリを再帰的にチェックする。エラーがあれば削除する
|
||||||
|
//! @param[out] metaDataCrashed メタデータが壊れていたかどうか。アーカイブごと削除するかどうかの判断に使用する
|
||||||
//! @param[out] modified ファイルかディレクトリを削除したかどうか。Commitするかどうかの判断に使用する
|
//! @param[out] modified ファイルかディレクトリを削除したかどうか。Commitするかどうかの判断に使用する
|
||||||
//! @param[in] baseName 削除するセーブデータの区別に表示するための名前
|
//! @param[in] baseName 削除するセーブデータの区別に表示するための名前
|
||||||
//! @param[in] currentDirectory チェックを開始するディレクトリ。スラッシュで終端すること
|
//! @param[in] currentDirectory チェックを開始するディレクトリ。スラッシュで終端すること
|
||||||
//! @param[in] erase ファイルかディレクトリを削除するかどうか
|
//! @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);
|
bool erase);
|
||||||
|
|
||||||
//! @brief ファイルサイズを取得する
|
//! @brief ファイルサイズを取得する
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user