Rework memstick moves between devices to copy, verify and then delete

This commit is contained in:
Henrik Rydgård 2024-01-22 21:52:39 +01:00
parent 9d9f03ebb7
commit 6e587f50f3
46 changed files with 205 additions and 63 deletions

View File

@ -69,7 +69,7 @@ struct FileSuffix {
u64 fileSize;
};
static bool ListFileSuffixesRecursively(const Path &root, const Path &folder, std::vector<std::string> &dirSuffixes, std::vector<FileSuffix> &fileSuffixes) {
static bool ListFileSuffixesRecursively(const Path &root, const Path &folder, std::vector<std::string> &dirSuffixes, std::vector<FileSuffix> &fileSuffixes, MoveProgressReporter &progressReporter) {
std::vector<File::FileInfo> files;
if (!File::GetFilesInDir(folder, &files)) {
return false;
@ -81,7 +81,8 @@ static bool ListFileSuffixesRecursively(const Path &root, const Path &folder, st
if (root.ComputePathTo(file.fullName, dirSuffix)) {
if (!dirSuffix.empty()) {
dirSuffixes.push_back(dirSuffix);
ListFileSuffixesRecursively(root, folder / file.name, dirSuffixes, fileSuffixes);
ListFileSuffixesRecursively(root, folder / file.name, dirSuffixes, fileSuffixes, progressReporter);
progressReporter.SetProgress(file.name, fileSuffixes.size(), (size_t)-1);
}
} else {
ERROR_LOG_REPORT(SYSTEM, "Failed to compute PathTo from '%s' to '%s'", root.c_str(), folder.c_str());
@ -101,16 +102,16 @@ static bool ListFileSuffixesRecursively(const Path &root, const Path &folder, st
bool MoveChildrenFast(const Path &moveSrc, const Path &moveDest, MoveProgressReporter &progressReporter) {
std::vector<File::FileInfo> files;
progressReporter.SetStatus("Starting move...");
if (!File::GetFilesInDir(moveSrc, &files)) {
return false;
}
for (auto file : files) {
for (size_t i = 0; i < files.size(); i++) {
auto &file = files[i];
// Construct destination path
Path fileSrc = file.fullName;
Path fileDest = moveDest / file.name;
progressReporter.SetStatus(file.name);
progressReporter.SetProgress(file.name, i, files.size());
INFO_LOG(SYSTEM, "About to move PSP data from '%s' to '%s'", fileSrc.c_str(), fileDest.c_str());
bool result = File::MoveIfFast(fileSrc, fileDest);
if (!result) {
@ -121,6 +122,21 @@ bool MoveChildrenFast(const Path &moveSrc, const Path &moveDest, MoveProgressRep
return true;
}
std::string MoveProgressReporter::Format() {
std::string str;
{
std::lock_guard<std::mutex> guard(mutex_);
if (max_ > 0) {
str = StringFromFormat("(%d/%d) ", count_, max_);
} else if (max_ < 0) {
str = StringFromFormat("(%d) ", count_);
}
str += progress_;
}
return str;
}
MoveResult *MoveDirectoryContentsSafe(Path moveSrc, Path moveDest, MoveProgressReporter &progressReporter) {
auto ms = GetI18NCategory(I18NCat::MEMSTICK);
if (moveSrc.GetFilename() != "PSP") {
@ -137,7 +153,7 @@ MoveResult *MoveDirectoryContentsSafe(Path moveSrc, Path moveDest, MoveProgressR
// We loop through the files/dirs in the source directory and just try to move them, it should work.
if (MoveChildrenFast(moveSrc, moveDest, progressReporter)) {
INFO_LOG(SYSTEM, "Quick-move succeeded");
progressReporter.SetStatus(ms->T("Done!"));
progressReporter.SetProgress(ms->T("Done!"));
return new MoveResult{
true, ""
};
@ -152,75 +168,113 @@ MoveResult *MoveDirectoryContentsSafe(Path moveSrc, Path moveDest, MoveProgressR
std::vector<std::string> directorySuffixesToCreate;
// NOTE: It's correct to pass moveSrc twice here, it's to keep the root in the recursion.
if (!ListFileSuffixesRecursively(moveSrc, moveSrc, directorySuffixesToCreate, fileSuffixesToMove)) {
if (!ListFileSuffixesRecursively(moveSrc, moveSrc, directorySuffixesToCreate, fileSuffixesToMove, progressReporter)) {
// TODO: Handle failure listing files.
std::string error = "Failed to read old directory";
INFO_LOG(SYSTEM, "%s", error.c_str());
progressReporter.SetStatus(ms->T(error.c_str()));
progressReporter.SetProgress(ms->T(error.c_str()));
return new MoveResult{ false, error };
}
bool dryRun = false; // Useful for debugging.
size_t failedFiles = 0;
size_t skippedFiles = 0;
// We're not moving huge files like ISOs during this process, unless
// they can be directly moved, without rewriting the file.
const uint64_t BIG_FILE_THRESHOLD = 24 * 1024 * 1024;
if (!moveSrc.empty()) {
// Better not interrupt the app while this is happening!
if (moveSrc.empty()) {
// Shouldn't happen.
return new MoveResult{ true, "", };
}
// Create all the necessary directories.
for (auto &dirSuffix : directorySuffixesToCreate) {
Path dir = moveDest / dirSuffix;
if (dryRun) {
INFO_LOG(SYSTEM, "dry run: Would have created dir '%s'", dir.c_str());
} else {
INFO_LOG(SYSTEM, "Creating dir '%s'", dir.c_str());
progressReporter.SetStatus(dirSuffix);
// Just ignore already-exists errors.
File::CreateDir(dir);
}
// Better not interrupt the app while this is happening!
// Create all the necessary directories.
for (size_t i = 0; i < directorySuffixesToCreate.size(); i++) {
const auto &dirSuffix = directorySuffixesToCreate[i];
Path dir = moveDest / dirSuffix;
if (dryRun) {
INFO_LOG(SYSTEM, "dry run: Would have created dir '%s'", dir.c_str());
} else {
INFO_LOG(SYSTEM, "Creating dir '%s'", dir.c_str());
progressReporter.SetProgress(dirSuffix);
// Just ignore already-exists errors.
File::CreateDir(dir);
}
}
for (auto &fileSuffix : fileSuffixesToMove) {
progressReporter.SetStatus(StringFromFormat("%s (%s)", fileSuffix.suffix.c_str(), NiceSizeFormat(fileSuffix.fileSize).c_str()));
for (size_t i = 0; i < fileSuffixesToMove.size(); i++) {
const auto &fileSuffix = fileSuffixesToMove[i];
progressReporter.SetProgress(StringFromFormat("%s (%s)", fileSuffix.suffix.c_str(), NiceSizeFormat(fileSuffix.fileSize).c_str()),
(int)i, (int)fileSuffixesToMove.size());
Path from = moveSrc / fileSuffix.suffix;
Path to = moveDest / fileSuffix.suffix;
Path from = moveSrc / fileSuffix.suffix;
Path to = moveDest / fileSuffix.suffix;
if (dryRun) {
INFO_LOG(SYSTEM, "dry run: Would have moved '%s' to '%s' (%d bytes)", from.c_str(), to.c_str(), (int)fileSuffix.fileSize);
if (dryRun) {
INFO_LOG(SYSTEM, "dry run: Would have moved '%s' to '%s' (%d bytes)", from.c_str(), to.c_str(), (int)fileSuffix.fileSize);
} else {
// Remove the "from" prefix from the path.
// We have to drop down to string operations for this.
if (!File::Copy(from, to)) {
ERROR_LOG(SYSTEM, "Failed to copy file '%s' to '%s'", from.c_str(), to.c_str());
failedFiles++;
// Should probably just bail?
} else {
// Remove the "from" prefix from the path.
// We have to drop down to string operations for this.
if (!File::Copy(from, to)) {
ERROR_LOG(SYSTEM, "Failed to copy file '%s' to '%s'", from.c_str(), to.c_str());
failedFiles++;
// Should probably just bail?
} else {
INFO_LOG(SYSTEM, "Copied file '%s' to '%s'", from.c_str(), to.c_str());
}
}
}
// Delete all the old, now hopefully empty, directories.
// Hopefully DeleteDir actually fails if it contains a file...
for (auto &dirSuffix : directorySuffixesToCreate) {
Path dir = moveSrc / dirSuffix;
if (dryRun) {
INFO_LOG(SYSTEM, "dry run: Would have deleted dir '%s'", dir.c_str());
} else {
INFO_LOG(SYSTEM, "Deleting dir '%s'", dir.c_str());
progressReporter.SetStatus(dirSuffix);
if (File::Exists(dir)) {
File::DeleteDir(dir);
}
INFO_LOG(SYSTEM, "Copied file '%s' to '%s'", from.c_str(), to.c_str());
}
}
}
return new MoveResult{ true, "", failedFiles };
if (failedFiles) {
return new MoveResult{ false, "", failedFiles };
}
// After the whole move, verify that all the files arrived correctly.
// If there's a single error, we do not delete the source data.
bool ok = true;
for (size_t i = 0; i < fileSuffixesToMove.size(); i++) {
const auto &fileSuffix = fileSuffixesToMove[i];
progressReporter.SetProgress(ms->T("Checking..."), (int)i, (int)fileSuffixesToMove.size());
Path to = moveDest / fileSuffix.suffix;
File::FileInfo info;
if (!File::GetFileInfo(to, &info)) {
ok = false;
break;
}
if (fileSuffix.fileSize != info.size) {
ERROR_LOG(SYSTEM, "Mismatched size in target file %s. Verification failed.", fileSuffix.suffix.c_str());
ok = false;
failedFiles++;
break;
}
}
if (!ok) {
return new MoveResult{ false, "", failedFiles };
}
INFO_LOG(SYSTEM, "Verification complete");
// Delete all the old, now hopefully empty, directories.
// Hopefully DeleteDir actually fails if it contains a file...
for (size_t i = 0; i < directorySuffixesToCreate.size(); i++) {
const auto &dirSuffix = directorySuffixesToCreate[i];
Path dir = moveSrc / dirSuffix;
if (dryRun) {
INFO_LOG(SYSTEM, "dry run: Would have deleted dir '%s'", dir.c_str());
} else {
INFO_LOG(SYSTEM, "Deleting dir '%s'", dir.c_str());
progressReporter.SetProgress(dirSuffix, i, directorySuffixesToCreate.size());
if (File::Exists(dir)) {
File::DeleteDir(dir);
}
}
}
return new MoveResult{ true, "", 0 };
}

View File

@ -3,24 +3,26 @@
#include "Common/File/Path.h"
#include <mutex>
#include <string_view>
// Utility functions moved out from MemstickScreen.
class MoveProgressReporter {
public:
void SetStatus(const std::string &value) {
void SetProgress(std::string_view value, size_t count = 0, size_t maxVal = 0) {
std::lock_guard<std::mutex> guard(mutex_);
progress_ = value;
count_ = (int)count;
max_ = (int)maxVal;
}
std::string Get() {
std::lock_guard<std::mutex> guard(mutex_);
return progress_;
}
std::string Format();
private:
std::string progress_;
std::mutex mutex_;
int count_;
int max_;
};
struct MoveResult {

View File

@ -518,7 +518,7 @@ void ConfirmMemstickMoveScreen::CreateViews() {
}
if (moveDataTask_) {
progressView_ = leftColumn->Add(new TextView(progressReporter_.Get()));
progressView_ = leftColumn->Add(new TextView(progressReporter_.Format()));
} else {
progressView_ = nullptr;
}
@ -545,19 +545,19 @@ void ConfirmMemstickMoveScreen::update() {
if (moveDataTask_) {
if (progressView_) {
progressView_->SetText(progressReporter_.Get());
progressView_->SetText(progressReporter_.Format());
}
MoveResult *result = moveDataTask_->Poll();
if (result) {
if (result->success) {
progressReporter_.SetStatus(iz->T("Done!"));
progressReporter_.SetProgress(iz->T("Done!"));
INFO_LOG(SYSTEM, "Move data task finished successfully!");
// Succeeded!
FinishFolderMove();
} else {
progressReporter_.SetStatus(iz->T("Failed to move some files!"));
progressReporter_.SetProgress(iz->T("Failed to move some files!"));
INFO_LOG(SYSTEM, "Move data task failed!");
// What do we do here? We might be in the middle of a move... Bad.
RecreateViews();
@ -575,7 +575,7 @@ UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams &params) {
// If the directory itself is called PSP, don't go below.
if (moveData_) {
progressReporter_.SetStatus(T(I18NCat::MEMSTICK, "Starting move..."));
progressReporter_.SetProgress(T(I18NCat::MEMSTICK, "Starting move..."));
moveDataTask_ = Promise<MoveResult *>::Spawn(&g_threadManager, [&]() -> MoveResult * {
Path moveSrc = g_Config.memStickDirectory;

View File

@ -848,12 +848,14 @@ Wlan = ‎الواي فاي
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Enthält bereits PSP Daten
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Daten können mit PPSSPP Regulär/Gold geteilt werden!
DataCannotBeShared = Daten können NICHT mit Regulär/Gold geteilt werden!
DataWillBeLostOnUninstall = Warnung! Dateien gehen verloren beim deinstallieren von PPSSPP.
DataWillStay = Dateien gehen NICHT verloren beim deinstallieren von PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Konnte ein paar Dateien nicht bewegen!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -1025,12 +1025,14 @@ written = Written in C++ for speed and portability
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -841,12 +841,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Ya contiene datos de PSP
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Crear o elegir la carpeta PSP
Current = Actual
DataCanBeShared = Los datos se pueden compartir entre PPSSPP regular/Gold
DataCannotBeShared = ¡Los datos NO se pueden compartir entre PPSSPP regular/Gold!
DataWillBeLostOnUninstall = ¡AVISO: los datos se perderán una vez desinstales PPSSPP!
DataWillStay = Los datos se mantendrán aunque desinstales PPSSPP.
Deleting... = Deleting...
Done! = ¡Hecho!
EasyUSBAccess = Acceso fácil USB
Failed to move some files! = ¡Error al mover algunos archivos!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Actualmente contiene datos de PSP
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Seleccionar o crear carpeta PSP
Current = Actual
DataCanBeShared = Datos pueden moverse entre PPSSPP regular/Gold
DataCannotBeShared = ¡Datos NO pueden moverse entre PPSSPP regular/Gold!
DataWillBeLostOnUninstall = ADVERTENCIA: ¡Datos pueden borrarse al desinstalar PPSSPP!
DataWillStay = Datos pueden mantenerse incluso si desinstalas PPSSPP.
Deleting... = Deleting...
Done! = ¡Hecho!
EasyUSBAccess = Acceso USB fácil
Failed to move some files! = ¡Falló al mover algunos archivos!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Sisältää jo PSP-tiedot
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Luo tai valitse PSP-kansio
Current = Nykyinen
DataCanBeShared = Tiedot voidaan jakaa PPSSPP:n tavallisen / Gold-version välillä
DataCannotBeShared = Tietoja EI VOIDA jakaan PPSSPP:n tavallisen / Gold-version välillä!
DataWillBeLostOnUninstall = Varoitus! Tiedot häviävät, kun poistat PPSSPP:n!
DataWillStay = Tiedot säilyvät jopa jos poistat PPSSPP:n.
Deleting... = Deleting...
Done! = Valmis!
EasyUSBAccess = Helppo USB-pääsy
Failed to move some files! = Joitain tiedostoja ei voitu siirtää!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Contient déjà des données PSP
Cancelled - try again = Annulé - réessayer
Checking... = Checking...
Create or Choose a PSP folder = Créer ou choisir un dossier PSP
Current = Current
DataCanBeShared = Les données peuvent être partagées entre PPSSPP régulier/Gold
DataCannotBeShared = Les données NE PEUVENT PAS être partagées entre PPSSPP régulier/Gold!
DataWillBeLostOnUninstall = Avertissement! Les données seront perdues lorsque vous désinstallez PPSSPP!
DataWillStay = Les données resteront même si vous désinstallez PPSSPP.
Deleting... = Deleting...
Done! = Terminé!
EasyUSBAccess = Easy USB access
Failed to move some files! = Impossible de déplacer certains fichiers!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Sudah berisi data PSP
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Buat atau Pilih berkas PSP
Current = Saat ini
DataCanBeShared = Data bisa dibagikan antar PPSSPP reguler/emas
DataCannotBeShared = Data tidak bisa dibagi antar PPSSPP reguler/emas!
DataWillBeLostOnUninstall = Peringatan! Data akan hilang ketika Anda menghapus PPSSPP!
DataWillStay = Data akan tetap ada meskipun Anda menghapus PPSSPP.
Deleting... = Deleting...
Done! = Selesai!
EasyUSBAccess = Akses mudah USB
Failed to move some files! = Gagal memindahkan beberapa berkas!

View File

@ -1019,12 +1019,14 @@ written = Scritto in C++ per velocità e portabilità
[MemStick]
Already contains PSP data = Contiene già dati PSP
Cancelled - try again = Annullato - prova di nuovo
Checking... = Checking...
Create or Choose a PSP folder = Scegli o crea una cartella PSP
Current = Corrente
DataCanBeShared = I dati possono essere condivisi tra PPSSPP normale/Gold
DataCannotBeShared = I dati NON possono essere condivisi tra PPSSPP normale/Gold!
DataWillBeLostOnUninstall = Attenzione! I dati andranno persi quando disinstalli PPSSPP!
DataWillStay = I dati rimarranno anche se disinstalli PPSSPP.
Deleting... = Deleting...
Done! = Fatto!
EasyUSBAccess = Facile accesso tramite USB
Failed to move some files! = Il trasferimento di alcuni file è fallito!

View File

@ -1018,10 +1018,12 @@ written = 速度と移植性を保つためにC++で書かれています
[MemStick]
Already contains PSP data = 既にPSPデータが存在しています。
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Current = 現在の
DataWillStay = データはPPSSPPをアンインストールしても残ります。
DataCanBeShared = 通常版/ゴールド間でのデータの共有が可能です。
DataCannotBeShared = 通常版/ゴールド間でのデータの共有は「できません」。
Deleting... = Deleting...
Done! = 完了!
EasyUSBAccess = PCとのUSB接続でフォルダにアクセスが簡単にできます。
Failed to move some files! = いくつかのファイルの移動に失敗しました!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -1001,12 +1001,14 @@ written = 속도와 이식성을 위해 C++로 작성되었습니다.
[MemStick]
Already contains PSP data = 이미 PSP 데이터가 포함되어 있습니다.
Cancelled - try again = 취소됨 - 다시 시도
Checking... = Checking...
Create or Choose a PSP folder = PSP 폴더 생성 또는 선택
Current = 현재
DataCanBeShared = PPSSPP 레귤러/골드 간에 데이터 공유 가능
DataCannotBeShared = PPSSPP 레귤러/골드 간에 데이터를 공유할 수 없습니다!
DataWillBeLostOnUninstall = 경고! PPSSPP를 제거하면 데이터가 손실됩니다!
DataWillStay = PPSSPP를 제거해도 데이터는 유지됩니다.
Deleting... = Deleting...
Done! = 완료!
EasyUSBAccess = 쉬운 USB 접속
Failed to move some files! = 일부 파일을 이동하지 못했습니다!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -845,12 +845,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Już zawiera dane PSP
Cancelled - try again = Anulowano - spróbuj ponownie
Checking... = Checking...
Create or Choose a PSP folder = Utwórz lub Wybierz folder PSP
Current = Obecny
DataCanBeShared = Dane mogą być udostępniane pomiędzy zwykłą wersją PPSSPP, a wersją Gold
DataCannotBeShared = Dane NIE mogą być udostępniane pomiędzy zwykłą wersją PPSSPP, a wersją Gold!
DataWillBeLostOnUninstall = Uwaga! Utracisz wszystkie dane po odinstalowaniu PPSSPP!
DataWillStay = Dane zostaną na urządzeniu, nawet po odinstalowaniu PPSSPP.
Deleting... = Deleting...
Done! = Ukończono!
EasyUSBAccess = Łatwy dostęþ do USB
Failed to move some files! = Nie udało się przenieść niektórych plików!

View File

@ -1025,12 +1025,14 @@ written = Escrito em C++ pela velocidade e portabilidade
[MemStick]
Already contains PSP data = Já contém dados do PSP
Cancelled - try again = Cancelado - tente de novo
Checking... = Checking...
Create or Choose a PSP folder = Criar ou escolher uma pasta do PSP
Current = Atual
DataCanBeShared = Os dados podem ser compartilhados entre o PPSSPP regular/Gold
DataCannotBeShared = Os dados NÃO PODEM ser compartilhados entre o PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Aviso! Os dados serão perdidos quando você desinstalar o PPSSPP!
DataWillStay = Os dados permanecerão mesmo se você desinstalar o PPSSPP.
Deleting... = Deleting...
Done! = Concluído!
EasyUSBAccess = Acesso fácil ao USB
Failed to move some files! = Falhou em mover alguns arquivos!

View File

@ -1044,12 +1044,14 @@ written = PPSSPP foi escrito em C++ pela sua velocidade e portabilidade
[MemStick]
Already contains PSP data = Já contém dados da PSP
Cancelled - try again = Cancelado - tenta de novo
Checking... = Checking...
Create or Choose a PSP folder = Criar ou escolher uma pasta da PSP
Current = Atual
DataCanBeShared = Os dados podem ser partilhados entre o PPSSPP Regular/Gold
DataCannotBeShared = Os dados não podem ser partilhados entre o PPSSPP Regular/Gold
DataWillBeLostOnUninstall = Aviso! Os dados serão perdidos quando desinstalares o PPSSPP!
DataWillStay = Os dados permanecerão intactos mesmo se desinstalares o PPSSPP.
Deleting... = Deleting...
Done! = Concluído!
EasyUSBAccess = Acesso fácil ao USB
Failed to move some files! = Erro ao mover alguns ficheiros!

View File

@ -841,12 +841,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -1018,12 +1018,14 @@ written = Написан на C++ для скорости и портируем
[MemStick]
Already contains PSP data = Уже содержит данные PSP
Cancelled - try again = Отменено - попробуйте еще раз
Checking... = Checking...
Create or Choose a PSP folder = Создайте или выберите папку PSP
Current = Текущая
DataCanBeShared = Данные могут передаваться между обычным PPSSPP и Gold
DataCannotBeShared = Данные НЕ МОГУТ передаваться между обычным PPSSPP и Gold!
DataWillBeLostOnUninstall = Внимание! Данные будут утеряны, если вы удалите PPSSPP!
DataWillStay = Данные останутся, даже если вы удалите PPSSPP
Deleting... = Deleting...
Done! = Завершено!
EasyUSBAccess = Простой доступ к USB
Failed to move some files! = Не получилось переместить некоторые файлы!

View File

@ -1019,12 +1019,14 @@ Spanish = Spanska
[MemStick]
Already contains PSP data = Innehåller redan PSP-data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Skapa eller välj en PSP-mapp
Current = Nuvarande
DataCanBeShared = Data kan delas mellan PPSSPP vanlig/Gold
DataCannotBeShared = Data KAN INTE delas mellan PPSSPP vanlig/Gold!
DataWillBeLostOnUninstall = Varning! Data kommer förloras om du avinstallerar PPSSPP!
DataWillStay = Data stannar kvar även om du avinstallerar PPSSPP.
Deleting... = Deleting...
Done! = Klar!
EasyUSBAccess = Lätt åtkomst via USB
Failed to move some files! = Misslyckades att flytta några filer!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = เครือข่าย
[MemStick]
Already contains PSP data = มีข้อมูลอยู่ข้างในนั้น
Cancelled - try again = ถูกยกเลิกแล้ว - ลองอีกครั้ง
Checking... = Checking...
Create or Choose a PSP folder = สร้างหรือเลือกโฟลเดอร์เก็บข้อมูล PSP
Current = ที่ใช้อยู่
DataCanBeShared = ข้อมูลสามารถใช้งานร่วมกันได้ ทั้งใน PPSSPP ตัวสีฟ้า/สีทอง
DataCannotBeShared = ข้อมูลไม่สามารถใช้งานร่วมกันได้ ทั้งใน PPSSPP ตัวสีฟ้า/สีทอง!
DataWillBeLostOnUninstall = คำเตือน! ข้อมูลอาจจะสูญหาย เมื่อคุณถอนการติดตั้ง PPSSPP!
DataWillStay = ข้อมูลจะยังคงอยู่ ถึงแม้ว่าจะถอนการติดตั้ง PPSSPP ออกไปแล้ว
Deleting... = Deleting...
Done! = เรียบร้อย!
EasyUSBAccess = การเข้าถึงข้อมูลทำได้ง่าย
Failed to move some files! = ล้มเหลวในการย้ายบางไฟล์!

View File

@ -842,12 +842,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Zaten PSP verisi içeriyor
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Bir PSP klasörü oluştur veya seç
Current = Current
DataCanBeShared = Veri PPSSPP normal/Gold arasında paylaşılabilir
DataCannotBeShared = Veri PPSSPP normal/Gold arasında PAYLAŞILAMAZ!
DataWillBeLostOnUninstall = Uyarı! PPSSPP'yi kaldırdığınızda veriler kaybolacak!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Tamamlandı!
EasyUSBAccess = Kolay USB erişimi
Failed to move some files! = Bazı dosyalar taşınamadı!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN
[MemStick]
Already contains PSP data = Already contains PSP data
Cancelled - try again = Cancelled - try again
Checking... = Checking...
Create or Choose a PSP folder = Create or Choose a PSP folder
Current = Current
DataCanBeShared = Data can be shared between PPSSPP regular/Gold
DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold!
DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP!
DataWillStay = Data will stay even if you uninstall PPSSPP.
Deleting... = Deleting...
Done! = Done!
EasyUSBAccess = Easy USB access
Failed to move some files! = Failed to move some files!

View File

@ -840,12 +840,14 @@ Wlan = WLAN键
[MemStick]
Already contains PSP data = 已含有PSP数据
Cancelled - try again = 已取消 - 请再次重试
Checking... = Checking...
Create or Choose a PSP folder = 创建或者选择PSP文件夹
Current = 目前
DataCanBeShared = 数据可以在普通版/黄金版之间共用
DataCannotBeShared = 数据无法在普通版/黄金版之间共用!
DataWillBeLostOnUninstall = 警告卸载PPSSPP后全部数据将丢失
DataWillStay = 卸载PPSSPP时数据能保留。
Deleting... = Deleting...
Done! = 完成!
EasyUSBAccess = USB连接更简单
Failed to move some files! = 无法移动部分文件!

View File

@ -1018,12 +1018,14 @@ written = 使用 C++ 編寫,以保證建置速度和相容性
[MemStick]
Already contains PSP data = 已包含 PSP 資料
Cancelled - try again = 已取消 - 再試一次
Checking... = Checking...
Create or Choose a PSP folder = 建立或選擇 PSP 資料夾
Current = 目前
DataCanBeShared = 資料可在 PPSSPP 標準版/黃金版之間共用
DataCannotBeShared = 資料無法在 PPSSPP 標準版/黃金版之間共用!
DataWillBeLostOnUninstall = 警告!資料會在解除安裝 PPSSPP 後遺失!
DataWillStay = 資料會在解除安裝 PPSSPP 後保留
Deleting... = Deleting...
Done! = 完成!
EasyUSBAccess = USB 輕鬆存取
Failed to move some files! = 無法移動部分檔案!