diff --git a/Userland/Libraries/LibCore/File.cpp b/Userland/Libraries/LibCore/File.cpp index 5c403544a7..319d094ce2 100644 --- a/Userland/Libraries/LibCore/File.cpp +++ b/Userland/Libraries/LibCore/File.cpp @@ -207,6 +207,20 @@ String File::current_working_directory() return cwd_as_string; } +String File::absolute_path(String const& path) +{ + if (File::exists(path)) + return File::real_path_for(path); + + if (path.starts_with("/"sv)) + return LexicalPath::canonicalized_path(path); + + auto working_directory = File::current_working_directory(); + auto full_path = LexicalPath::join(working_directory, path); + + return LexicalPath::canonicalized_path(full_path.string()); +} + #ifdef __serenity__ String File::read_link(String const& link_path) diff --git a/Userland/Libraries/LibCore/File.h b/Userland/Libraries/LibCore/File.h index 814d21a6fc..419ec4b416 100644 --- a/Userland/Libraries/LibCore/File.h +++ b/Userland/Libraries/LibCore/File.h @@ -36,6 +36,7 @@ public: static bool exists(const String& filename); static bool ensure_parent_directories(const String& path); static String current_working_directory(); + static String absolute_path(String const& path); enum class RecursionMode { Allowed,