diff --git a/Userland/Libraries/LibFileSystem/FileSystem.cpp b/Userland/Libraries/LibFileSystem/FileSystem.cpp index 8a12744562..4a1d2774e2 100644 --- a/Userland/Libraries/LibFileSystem/FileSystem.cpp +++ b/Userland/Libraries/LibFileSystem/FileSystem.cpp @@ -298,6 +298,24 @@ ErrorOr copy_file_or_directory(StringView destination_path, StringView sou return copy_file(final_destination_path, source_path, source_stat, *source, preserve_mode); } +ErrorOr move_file(StringView destination_path, StringView source_path, PreserveMode preserve_mode) +{ + auto maybe_error = Core::System::rename(source_path, destination_path); + if (!maybe_error.is_error()) + return {}; + + if (!maybe_error.error().is_errno() || maybe_error.error().code() != EXDEV) + return maybe_error; + + auto source = TRY(Core::File::open(source_path, Core::File::OpenMode::Read)); + + auto source_stat = TRY(Core::System::fstat(source->fd())); + + TRY(copy_file(destination_path, source_path, source_stat, *source, preserve_mode)); + + return Core::System::unlink(source_path); +} + ErrorOr remove(StringView path, RecursionMode mode) { if (is_directory(path) && mode == RecursionMode::Allowed) { diff --git a/Userland/Libraries/LibFileSystem/FileSystem.h b/Userland/Libraries/LibFileSystem/FileSystem.h index ec78c022d6..46ac6f85fd 100644 --- a/Userland/Libraries/LibFileSystem/FileSystem.h +++ b/Userland/Libraries/LibFileSystem/FileSystem.h @@ -66,6 +66,7 @@ AK_ENUM_BITWISE_OPERATORS(PreserveMode); ErrorOr copy_file(StringView destination_path, StringView source_path, struct stat const& source_stat, Core::File& source, PreserveMode = PreserveMode::Nothing); ErrorOr copy_directory(StringView destination_path, StringView source_path, struct stat const& source_stat, LinkMode = LinkMode::Disallowed, PreserveMode = PreserveMode::Nothing); ErrorOr copy_file_or_directory(StringView destination_path, StringView source_path, RecursionMode = RecursionMode::Allowed, LinkMode = LinkMode::Disallowed, AddDuplicateFileMarker = AddDuplicateFileMarker::Yes, PreserveMode = PreserveMode::Nothing); +ErrorOr move_file(StringView destination_path, StringView source_path, PreserveMode = PreserveMode::Nothing); ErrorOr remove(StringView path, RecursionMode); ErrorOr size(StringView path); bool can_delete_or_move(StringView path);