diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp index d5984f560b..20e050c8a8 100644 --- a/src/core/hle/service/filesystem/filesystem.cpp +++ b/src/core/hle/service/filesystem/filesystem.cpp @@ -227,12 +227,13 @@ Result VfsDirectoryServiceWrapper::RenameDirectory(const std::string& src_path_, std::string src_path(Common::FS::SanitizePath(src_path_)); std::string dest_path(Common::FS::SanitizePath(dest_path_)); auto src = GetDirectoryRelativeWrapped(backing, src_path); + if (src == nullptr) + return FileSys::ResultPathNotFound; + if (Common::FS::GetParentPath(src_path) == Common::FS::GetParentPath(dest_path)) { - // Use more-optimized vfs implementation rename. - if (src == nullptr) - return FileSys::ResultPathNotFound; - if (!src->Rename(Common::FS::GetFilename(dest_path))) { - // TODO(DarkLordZach): Find a better error code for this + std::string full_src_path = backing->GetFullPath() + "/" + src_path; + std::string full_dest_path = backing->GetFullPath() + "/" + dest_path; + if (!Common::FS::RenameDir(full_src_path, full_dest_path)) { return ResultUnknown; } return ResultSuccess; diff --git a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp index d16602022a..edd381f57c 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp @@ -24,7 +24,7 @@ IFileSystem::IFileSystem(Core::System& system_, FileSys::VirtualDir dir_, SizeGe {3, D<&IFileSystem::DeleteDirectory>, "DeleteDirectory"}, {4, D<&IFileSystem::DeleteDirectoryRecursively>, "DeleteDirectoryRecursively"}, {5, D<&IFileSystem::RenameFile>, "RenameFile"}, - {6, nullptr, "RenameDirectory"}, + {6, D<&IFileSystem::RenameDirectory>, "RenameDirectory"}, {7, D<&IFileSystem::GetEntryType>, "GetEntryType"}, {8, D<&IFileSystem::OpenFile>, "OpenFile"}, {9, D<&IFileSystem::OpenDirectory>, "OpenDirectory"}, @@ -88,6 +88,14 @@ Result IFileSystem::RenameFile( R_RETURN(backend->RenameFile(FileSys::Path(old_path->str), FileSys::Path(new_path->str))); } +Result IFileSystem::RenameDirectory( + const InLargeData old_path, + const InLargeData new_path) { + LOG_DEBUG(Service_FS, "called. directory '{}' to directory '{}'", old_path->str, new_path->str); + + R_RETURN(backend->RenameDirectory(FileSys::Path(old_path->str), FileSys::Path(new_path->str))); +} + Result IFileSystem::OpenFile(OutInterface out_interface, const InLargeData path, u32 mode) { diff --git a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h index dd069f36f3..ed03c3ef83 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -36,6 +39,8 @@ public: const InLargeData path); Result RenameFile(const InLargeData old_path, const InLargeData new_path); + Result RenameDirectory(const InLargeData old_path, + const InLargeData new_path); Result OpenFile(OutInterface out_interface, const InLargeData path, u32 mode); Result OpenDirectory(OutInterface out_interface,