事前にファイルサイズを計算しておいて進捗を取得できるように

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:
N2614 2011-08-01 09:51:23 +00:00
parent 718e114848
commit 5405bf2a6d
2 changed files with 170 additions and 5 deletions

View File

@ -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::fs::Directory dir;
@ -102,6 +108,7 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wst
{
s32 readSize;
result = file.TryRead(&readSize, m_Buf, m_Bufsize);
m_TotalReadSize += readSize;
if(result.IsFailure())
{
nn::dbg::PrintResult(result);
@ -125,6 +132,83 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wst
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()
{
// TODO 自動生成されたコンストラクター・スタブ
@ -144,14 +228,19 @@ NandSavedataChecker::~NandSavedataChecker()
nn::Result NandSavedataChecker::CleanUp()
{
nn::Result result;
{
SharedExtSavedataChecker sharedExtSaveChecker(m_Buf, m_Bufsize);
result = sharedExtSaveChecker.CalculateFileSize();
NN_UTIL_RETURN_IF_FAILED(result);
result = sharedExtSaveChecker.CleanUp();
NN_UTIL_RETURN_IF_FAILED(result);
}
{
SystemSavedataChecker syssaveChecker(m_Buf, m_Bufsize);
result = syssaveChecker.CalculateFileSize();
NN_UTIL_RETURN_IF_FAILED(result);
result = syssaveChecker.CleanUp();
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::Unmount("ssave:");
result = nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME);
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;
}
@ -291,4 +400,33 @@ nn::Result SharedExtSavedataChecker::CleanUp()
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 */

View File

@ -119,17 +119,38 @@ class SavedataCheckerBase
public:
SavedataCheckerBase() {}
SavedataCheckerBase(void* buf, size_t size);
~SavedataCheckerBase() {}
~SavedataCheckerBase();
virtual nn::Result CleanUp() = 0;
virtual nn::Result CalculateFileSize() = 0;
protected:
//! @brief ファイルとディレクトリを再帰的にチェックする。エラーがあれば削除する
//! @param[out] modified ファイルかディレクトリを削除したかどうか
//! @param[in] 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;
//! バッファサイズ
size_t m_Bufsize;
//! 事前読み取りサイズ
size_t m_CalculatedFileSize;
//! 累計読み取りサイズ
size_t m_TotalReadSize;
};
@ -142,7 +163,10 @@ public:
~SystemSavedataChecker();
//! @brief システムセーブデータを調べて問題があるファイルを削除する
nn::Result CleanUp();
virtual nn::Result CleanUp();
//! @brief ファイルサイズをチェックする
virtual nn::Result CalculateFileSize();
};
//! @brief 共有拡張セーブデータをチェックするためのクラス
@ -154,7 +178,10 @@ public:
~SharedExtSavedataChecker();
//! @brief 共有拡張セーブデータを調べて問題があるファイルを削除する
nn::Result CleanUp();
virtual nn::Result CleanUp();
//! @brief ファイルサイズをチェックする
virtual nn::Result CalculateFileSize();
};