mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-03 21:41:26 +12:00
fs::rename fixed
Added overwriting policy sys_fs_rename improved
This commit is contained in:
parent
da3f3fd1fb
commit
010b75251f
5 changed files with 44 additions and 8 deletions
|
@ -510,7 +510,7 @@ bool fs::remove_dir(const std::string& path)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool fs::rename(const std::string& from, const std::string& to)
|
bool fs::rename(const std::string& from, const std::string& to, bool overwrite)
|
||||||
{
|
{
|
||||||
const auto device = get_virtual_device(from);
|
const auto device = get_virtual_device(from);
|
||||||
|
|
||||||
|
@ -525,14 +525,43 @@ bool fs::rename(const std::string& from, const std::string& to)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (!MoveFileW(to_wchar(from).get(), to_wchar(to).get()))
|
const auto ws1 = to_wchar(from);
|
||||||
|
const auto ws2 = to_wchar(to);
|
||||||
|
|
||||||
|
if (!MoveFileExW(ws1.get(), ws2.get(), overwrite ? MOVEFILE_REPLACE_EXISTING : 0))
|
||||||
{
|
{
|
||||||
g_tls_error = to_error(GetLastError());
|
DWORD error1 = GetLastError();
|
||||||
|
|
||||||
|
if (overwrite && error1 == ERROR_ACCESS_DENIED && is_dir(from) && is_dir(to))
|
||||||
|
{
|
||||||
|
if (RemoveDirectoryW(ws2.get()))
|
||||||
|
{
|
||||||
|
if (MoveFileW(ws1.get(), ws2.get()))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
error1 = GetLastError();
|
||||||
|
CreateDirectoryW(ws2.get(), NULL); // TODO
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error1 = GetLastError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_tls_error = to_error(error1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
|
if (!overwrite && exists(to))
|
||||||
|
{
|
||||||
|
g_tls_error = fs::error::exist;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (::rename(from.c_str(), to.c_str()) != 0)
|
if (::rename(from.c_str(), to.c_str()) != 0)
|
||||||
{
|
{
|
||||||
g_tls_error = to_error(errno);
|
g_tls_error = to_error(errno);
|
||||||
|
|
|
@ -159,7 +159,7 @@ namespace fs
|
||||||
bool create_path(const std::string& path);
|
bool create_path(const std::string& path);
|
||||||
|
|
||||||
// Rename (move) file or directory
|
// Rename (move) file or directory
|
||||||
bool rename(const std::string& from, const std::string& to);
|
bool rename(const std::string& from, const std::string& to, bool overwrite);
|
||||||
|
|
||||||
// Copy file contents
|
// Copy file contents
|
||||||
bool copy_file(const std::string& from, const std::string& to, bool overwrite);
|
bool copy_file(const std::string& from, const std::string& to, bool overwrite);
|
||||||
|
|
|
@ -393,7 +393,7 @@ error_code cellGameContentPermit(vm::ptr<char[CELL_GAME_PATH_MAX]> contentInfoPa
|
||||||
fmt::throw_exception("cellGameContentPermit(): epic fail: directory '%s' already exists", dir);
|
fmt::throw_exception("cellGameContentPermit(): epic fail: directory '%s' already exists", dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fs::rename(prm->temp, vdir))
|
if (fs::rename(prm->temp, vdir, false))
|
||||||
{
|
{
|
||||||
cellGame.success("cellGameContentPermit(): directory '%s' has been created", dir);
|
cellGame.success("cellGameContentPermit(): directory '%s' has been created", dir);
|
||||||
}
|
}
|
||||||
|
|
|
@ -580,9 +580,16 @@ error_code sys_fs_rename(vm::cptr<char> from, vm::cptr<char> to)
|
||||||
{
|
{
|
||||||
sys_fs.warning("sys_fs_rename(from=%s, to=%s)", from, to);
|
sys_fs.warning("sys_fs_rename(from=%s, to=%s)", from, to);
|
||||||
|
|
||||||
if (!fs::rename(vfs::get(from.get_ptr()), vfs::get(to.get_ptr())))
|
if (!fs::rename(vfs::get(from.get_ptr()), vfs::get(to.get_ptr()), false))
|
||||||
{
|
{
|
||||||
return {CELL_ENOENT, from}; // ???
|
switch (auto error = fs::g_tls_error)
|
||||||
|
{
|
||||||
|
case fs::error::noent: return {CELL_ENOENT, from};
|
||||||
|
case fs::error::exist: return {CELL_EEXIST, to};
|
||||||
|
default: sys_fs.error("sys_fs_rename(): unknown error %s", error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {CELL_EIO, from}; // ???
|
||||||
}
|
}
|
||||||
|
|
||||||
sys_fs.notice("sys_fs_rename(): %s renamed to %s", from, to);
|
sys_fs.notice("sys_fs_rename(): %s renamed to %s", from, to);
|
||||||
|
|
|
@ -376,7 +376,7 @@ void Emulator::Load(bool add_only)
|
||||||
LOG_ERROR(LOADER, "Disc game %s found at invalid location /dev_hdd0/game/", m_title_id);
|
LOG_ERROR(LOADER, "Disc game %s found at invalid location /dev_hdd0/game/", m_title_id);
|
||||||
|
|
||||||
// Move and retry from correct location
|
// Move and retry from correct location
|
||||||
if (fs::rename(elf_dir + "/../../", hdd0_disc + elf_dir.substr(hdd0_game.size()) + "/../../"))
|
if (fs::rename(elf_dir + "/../../", hdd0_disc + elf_dir.substr(hdd0_game.size()) + "/../../", false))
|
||||||
{
|
{
|
||||||
LOG_SUCCESS(LOADER, "Disc game %s moved to special location /dev_hdd0/disc/", m_title_id);
|
LOG_SUCCESS(LOADER, "Disc game %s moved to special location /dev_hdd0/disc/", m_title_id);
|
||||||
return SetPath(hdd0_disc + m_path.substr(hdd0_game.size())), Load();
|
return SetPath(hdd0_disc + m_path.substr(hdd0_game.size())), Load();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue