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@414 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
parent
718e114848
commit
5405bf2a6d
@ -28,11 +28,17 @@ namespace
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SavedataCheckerBase::SavedataCheckerBase(void* buf, size_t size) : m_Buf(buf), m_Bufsize(size)
|
SavedataCheckerBase::SavedataCheckerBase(void* buf, size_t size) :
|
||||||
|
m_Buf(buf), m_Bufsize(size), m_CalculatedFileSize(0), m_TotalReadSize(0)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SavedataCheckerBase::~SavedataCheckerBase()
|
||||||
|
{
|
||||||
|
NN_LOG("m_TotalReadSize = %d\n", m_TotalReadSize);
|
||||||
|
}
|
||||||
|
|
||||||
nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wstring currentDirectory)
|
nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wstring currentDirectory)
|
||||||
{
|
{
|
||||||
nn::fs::Directory dir;
|
nn::fs::Directory dir;
|
||||||
@ -102,6 +108,7 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wst
|
|||||||
{
|
{
|
||||||
s32 readSize;
|
s32 readSize;
|
||||||
result = file.TryRead(&readSize, m_Buf, m_Bufsize);
|
result = file.TryRead(&readSize, m_Buf, m_Bufsize);
|
||||||
|
m_TotalReadSize += readSize;
|
||||||
if(result.IsFailure())
|
if(result.IsFailure())
|
||||||
{
|
{
|
||||||
nn::dbg::PrintResult(result);
|
nn::dbg::PrintResult(result);
|
||||||
@ -125,6 +132,83 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wst
|
|||||||
return nn::ResultSuccess();
|
return nn::ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nn::Result SavedataCheckerBase::GetFileSize(std::wstring currentDirectory)
|
||||||
|
{
|
||||||
|
nn::fs::Directory dir;
|
||||||
|
nn::fs::DirectoryEntry entry;
|
||||||
|
nn::Result result;
|
||||||
|
|
||||||
|
COMMON_LOGGER("%s\n", common::GetCharStr(currentDirectory.c_str()));
|
||||||
|
result = dir.TryInitialize(currentDirectory.c_str());
|
||||||
|
if(result.IsFailure())
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
s32 numRead;
|
||||||
|
result = dir.TryRead(&numRead, &entry, 1);
|
||||||
|
if(result.IsFailure())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(numRead == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (std::wcscmp(entry.entryName, L".") == 0 || std::wcscmp(entry.entryName, L"..") == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ディレクトリの場合
|
||||||
|
if (entry.attributes.isDirectory)
|
||||||
|
{
|
||||||
|
return GetFileSize(currentDirectory + std::wstring(entry.entryName) + std::wstring(L"/"));
|
||||||
|
}
|
||||||
|
// ファイルの場合
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nn::fs::FileInputStream file;
|
||||||
|
std::wstring filePath = (currentDirectory + std::wstring(entry.entryName)).c_str();
|
||||||
|
const wchar_t* path = filePath.c_str();
|
||||||
|
|
||||||
|
COMMON_LOGGER("%s\n", common::GetCharStr(path));
|
||||||
|
|
||||||
|
result = file.TryInitialize(path);
|
||||||
|
if(result.IsFailure())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_CalculatedFileSize += file.GetSize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nn::ResultSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
|
nn::Result SavedataCheckerBase::GetProgress(s32* progress)
|
||||||
|
{
|
||||||
|
if(m_CalculatedFileSize != 0)
|
||||||
|
{
|
||||||
|
*progress = m_TotalReadSize * 100 / m_CalculatedFileSize;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*progress = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nn::ResultSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NandSavedataChecker::NandSavedataChecker()
|
NandSavedataChecker::NandSavedataChecker()
|
||||||
{
|
{
|
||||||
// TODO 自動生成されたコンストラクター・スタブ
|
// TODO 自動生成されたコンストラクター・スタブ
|
||||||
@ -144,14 +228,19 @@ NandSavedataChecker::~NandSavedataChecker()
|
|||||||
nn::Result NandSavedataChecker::CleanUp()
|
nn::Result NandSavedataChecker::CleanUp()
|
||||||
{
|
{
|
||||||
nn::Result result;
|
nn::Result result;
|
||||||
|
|
||||||
{
|
{
|
||||||
SharedExtSavedataChecker sharedExtSaveChecker(m_Buf, m_Bufsize);
|
SharedExtSavedataChecker sharedExtSaveChecker(m_Buf, m_Bufsize);
|
||||||
|
result = sharedExtSaveChecker.CalculateFileSize();
|
||||||
|
NN_UTIL_RETURN_IF_FAILED(result);
|
||||||
result = sharedExtSaveChecker.CleanUp();
|
result = sharedExtSaveChecker.CleanUp();
|
||||||
NN_UTIL_RETURN_IF_FAILED(result);
|
NN_UTIL_RETURN_IF_FAILED(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
SystemSavedataChecker syssaveChecker(m_Buf, m_Bufsize);
|
SystemSavedataChecker syssaveChecker(m_Buf, m_Bufsize);
|
||||||
|
result = syssaveChecker.CalculateFileSize();
|
||||||
|
NN_UTIL_RETURN_IF_FAILED(result);
|
||||||
result = syssaveChecker.CleanUp();
|
result = syssaveChecker.CleanUp();
|
||||||
NN_UTIL_RETURN_IF_FAILED(result);
|
NN_UTIL_RETURN_IF_FAILED(result);
|
||||||
}
|
}
|
||||||
@ -208,12 +297,32 @@ nn::Result SystemSavedataChecker::CleanUp()
|
|||||||
result = nn::fs::CommitSystemSaveData(SYSTEM_SAVEDATA_ARCHIVE_NAME);
|
result = nn::fs::CommitSystemSaveData(SYSTEM_SAVEDATA_ARCHIVE_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
result = nn::fs::Unmount("ssave:");
|
result = nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME);
|
||||||
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
|
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
nn::Result SystemSavedataChecker::CalculateFileSize()
|
||||||
|
{
|
||||||
|
nn::Result result;
|
||||||
|
|
||||||
|
for (s32 i = 0; i < SYSTEM_SAVE_DATA_NUM; i++)
|
||||||
|
{
|
||||||
|
result = nn::fs::MountSystemSaveData(SYSTEM_SAVEDATA_ARCHIVE_NAME, SYSTEM_SAVEDATA_COUPLE_LIST[i].id );
|
||||||
|
if (result.IsSuccess())
|
||||||
|
{
|
||||||
|
result = GetFileSize(L"ssave:/");
|
||||||
|
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
|
||||||
|
|
||||||
|
result = nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME);
|
||||||
|
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NN_LOG("CalculatedFileSize = %d\n", m_CalculatedFileSize);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -291,4 +400,33 @@ nn::Result SharedExtSavedataChecker::CleanUp()
|
|||||||
return nn::ResultSuccess();
|
return nn::ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nn::Result SharedExtSavedataChecker::CalculateFileSize()
|
||||||
|
{
|
||||||
|
nn::Result result;
|
||||||
|
|
||||||
|
const size_t ARRAY_SIZE = 256;
|
||||||
|
s32 numId;
|
||||||
|
bit32 IdArray[ARRAY_SIZE];
|
||||||
|
|
||||||
|
result = nn::fs::EnumerateSharedExtSaveData(&numId, IdArray, ARRAY_SIZE);
|
||||||
|
NN_UTIL_RETURN_IF_FAILED(result);
|
||||||
|
|
||||||
|
NN_LOG_DEBUG("ExtData num = %d\n", numId);
|
||||||
|
for (s32 i = 0; i < numId; i++ )
|
||||||
|
{
|
||||||
|
result = nn::fs::MountSharedExtSaveData(SHARED_EXT_SAVEDATA_ARCHIVE_NAME, IdArray[i]);
|
||||||
|
if (result.IsSuccess())
|
||||||
|
{
|
||||||
|
result = GetFileSize(L"shext:/");
|
||||||
|
NN_UTIL_RETURN_IF_FAILED(result);
|
||||||
|
|
||||||
|
result = nn::fs::Unmount(SHARED_EXT_SAVEDATA_ARCHIVE_NAME);
|
||||||
|
NN_UTIL_RETURN_IF_FAILED(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NN_LOG("CalculatedFileSize = %d\n", m_CalculatedFileSize);
|
||||||
|
return nn::ResultSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
} /* namespace ConsoleBackup */
|
} /* namespace ConsoleBackup */
|
||||||
|
|||||||
@ -119,17 +119,38 @@ class SavedataCheckerBase
|
|||||||
public:
|
public:
|
||||||
SavedataCheckerBase() {}
|
SavedataCheckerBase() {}
|
||||||
SavedataCheckerBase(void* buf, size_t size);
|
SavedataCheckerBase(void* buf, size_t size);
|
||||||
~SavedataCheckerBase() {}
|
~SavedataCheckerBase();
|
||||||
|
|
||||||
|
virtual nn::Result CleanUp() = 0;
|
||||||
|
virtual nn::Result CalculateFileSize() = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
//! @brief ファイルとディレクトリを再帰的にチェックする。エラーがあれば削除する
|
||||||
|
//! @param[out] modified ファイルかディレクトリを削除したかどうか
|
||||||
|
//! @param[in] currentDirectory チェックを開始するディレクトリ。スラッシュで終端すること。
|
||||||
nn::Result CleanUpFilesRecursively(bool* modified, std::wstring currentDirectory);
|
nn::Result CleanUpFilesRecursively(bool* modified, std::wstring currentDirectory);
|
||||||
|
|
||||||
|
//! @brief ファイルサイズを取得する
|
||||||
|
//! @param[out] size ファイルサイズ
|
||||||
|
//! @param[in] currentDirectory チェックを開始するディレクトリ。スラッシュで終端すること。
|
||||||
|
nn::Result GetFileSize(std::wstring currentDirectory);
|
||||||
|
|
||||||
|
//! @brief 進捗を取得する
|
||||||
|
//! @param[out] progress 0~100で表される進捗
|
||||||
|
nn::Result GetProgress(s32* progress);
|
||||||
|
|
||||||
//! バッファ
|
//! バッファ
|
||||||
void* m_Buf;
|
void* m_Buf;
|
||||||
|
|
||||||
//! バッファサイズ
|
//! バッファサイズ
|
||||||
size_t m_Bufsize;
|
size_t m_Bufsize;
|
||||||
|
|
||||||
|
//! 事前読み取りサイズ
|
||||||
|
size_t m_CalculatedFileSize;
|
||||||
|
|
||||||
|
//! 累計読み取りサイズ
|
||||||
|
size_t m_TotalReadSize;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -142,7 +163,10 @@ public:
|
|||||||
~SystemSavedataChecker();
|
~SystemSavedataChecker();
|
||||||
|
|
||||||
//! @brief システムセーブデータを調べて問題があるファイルを削除する
|
//! @brief システムセーブデータを調べて問題があるファイルを削除する
|
||||||
nn::Result CleanUp();
|
virtual nn::Result CleanUp();
|
||||||
|
|
||||||
|
//! @brief ファイルサイズをチェックする
|
||||||
|
virtual nn::Result CalculateFileSize();
|
||||||
};
|
};
|
||||||
|
|
||||||
//! @brief 共有拡張セーブデータをチェックするためのクラス
|
//! @brief 共有拡張セーブデータをチェックするためのクラス
|
||||||
@ -154,7 +178,10 @@ public:
|
|||||||
~SharedExtSavedataChecker();
|
~SharedExtSavedataChecker();
|
||||||
|
|
||||||
//! @brief 共有拡張セーブデータを調べて問題があるファイルを削除する
|
//! @brief 共有拡張セーブデータを調べて問題があるファイルを削除する
|
||||||
nn::Result CleanUp();
|
virtual nn::Result CleanUp();
|
||||||
|
|
||||||
|
//! @brief ファイルサイズをチェックする
|
||||||
|
virtual nn::Result CalculateFileSize();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user