SaveManager::SaveManager() : lastBackupTime(0) { if (!Settings::get().getEnableBackups()) return; PWSTR buffer; HRESULT hr = SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &buffer); if (FAILED(hr) || !buffer) return; std::wstring documents(buffer); CoTaskMemFree(buffer); std::wstring search_userdir = StringFromFormat(L"%s%s", documents.c_str(), L"\\NBGI\\DarkSouls\\*"); // find user save folder WIN32_FIND_DATAW userSaveFolderData; HANDLE searchHandle = FindFirstFileW(search_userdir.c_str(), &userSaveFolderData); if (searchHandle != INVALID_HANDLE_VALUE) { do { if (wcslen(userSaveFolderData.cFileName) > 2) { userSaveFolder = StringFromFormat(L"%s\\NBGI\\DarkSouls\\%s", documents.c_str(), userSaveFolderData.cFileName); userBackupFolder = StringFromFormat(L"%s\\backup", userSaveFolder.c_str()); saveGameFile = StringFromFormat(L"%s\\DRAKS0005.sl2", userSaveFolder.c_str()); CreateDirectoryW(userBackupFolder.c_str(), NULL); SDLOG(0, "SaveManager: user save folder is %ls", userSaveFolder.c_str()); SDLOG(0, "SaveManager: user backup folder is %ls", userBackupFolder.c_str()); break; } } while (FindNextFileW(searchHandle, &userSaveFolderData)); } if (userBackupFolder.empty()) { SDLOG(0, "SaveManager: could not determine user save folder"); return; } std::wstring newPath = StringFromFormat(L"%s\\start.bak", userBackupFolder.c_str()); CopyFileW(saveGameFile.c_str(), newPath.c_str(), FALSE); removeOldBackups(); }
void SaveManager::backup(const time_t curTime) { SDLOG(1, "SaveManager: Backing up save files\n"); char buffer[MAX_PATH]; vector<string> saveFiles = getSaveFiles(); for(size_t i=0; i<saveFiles.size(); ++i) { string fn = getFileNameFromPath(saveFiles[i]); sprintf_s(buffer, "%s\\%0" TIMESTAMP_LENGTH_STR "lu_", userSaveFolder.c_str(), curTime); string newPath = string(buffer) + fn + ".bak"; if(CopyFile(saveFiles[i].c_str(), newPath.c_str(), false) == 0) { SDLOG(0, "ERROR: SaveManager failed to back up file! (Copying %s to %s)\n", saveFiles[i].c_str(), buffer); } else { SDLOG(1, "SaveManager: Backed up %s\n", fn.c_str()); } } removeOldBackups(); }
void SaveManager::autoBackup(const time_t curTime) { SDLOG(1, "SaveManager: Backing up save files"); std::wstring newPath = StringFromFormat(L"%s\\%012llu_auto.bak", userBackupFolder.c_str(), curTime); if (CopyFileW(saveGameFile.c_str(), newPath.c_str(), FALSE) == FALSE) { SDLOG(0, "ERROR: SaveManager failed to back up file! (Copying %ls to %ls)", saveGameFile.c_str(), newPath.c_str()); } else { SDLOG(1, "SaveManager: Backed up %ls", saveGameFile.c_str()); MessageBeep(MB_ICONASTERISK); } removeOldBackups(); }
void SaveManager::init() { if(Settings::get().getEnableBackups()) { CHAR documents[MAX_PATH]; HRESULT hr = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, documents); char buffer[MAX_PATH]; sprintf_s(buffer, "%s%s", documents, "\\NBGI\\DarkSouls\\*"); // find user save folder WIN32_FIND_DATA userSaveFolderData; HANDLE searchHandle = FindFirstFile(buffer, &userSaveFolderData); bool found = false; if(searchHandle != INVALID_HANDLE_VALUE) { do { std::string fn = userSaveFolderData.cFileName; bool dir = userSaveFolderData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; bool saveFile = fn.substr(fn.find_last_of(".") + 1) == "sl2"; // newer versions don't contain an additional folder under NBGI\\DarkSouls if (fn.size() > 2 && (dir || saveFile)) { if (dir) sprintf_s(buffer, "%s%s%s", documents, "\\NBGI\\DarkSouls\\", userSaveFolderData.cFileName); else sprintf_s(buffer, "%s%s", documents, "\\NBGI\\DarkSouls"); userSaveFolder = string(buffer); SDLOG(0, "SaveManager: user save folder is %s\n", userSaveFolder.c_str()); found = true; break; } } while(FindNextFile(searchHandle, &userSaveFolderData)); } if(!found) { SDLOG(0, "SaveManager: could not determine user save folder\n"); return; } removeOldBackups(); } }