Working with Paths in Elements RTL
Elements RTL, our (optional) cross-platform abstraction library, provides a rich API for working with filenames and and paths.
For one, it replicates the System.IO.Path
class from .NET, which provides many APIs for parsing and manipulating paths, and it also has a Url
class that has can be used for file-based URLs and offers many options to working with the path portion of an URL. On Cocoa, this class also seamlessly casts to NSURL
, which many of the system APIs use for file access — which is very helpful.
But more conveniently, Elements RTL introduces a whole bunch of methods on the String
type itself that can be used to work with strings that contain file names and file paths. For example, simply calling MyString.PathExtension
will give back you the file extension, if any (including the ".
" — consistently on all platforms).
Many of these String APIs come in three flavor, a regular one and one with Windows
or Unix
in the name respectively.
With Elements RTL being targeted for multi-platform use, the default versions of all string APIs will work correctly with paths on the current platform — that means on Unix-based systems they will use forward slashes, while in Windows they will use backslash, and so forth.
When writing regular code that deals with files on the local system, you will usually want to use these versions of the APIs, and you can be assured they will "just work", regardless on what system your code runs on, Windows, Mac, Linux or elsewhere:
LastPathComponent
LastPathComponentWithoutExtension
PathWithoutExtension
PathExtension
ParentDirectory
AppendPath
IsAbsolutePath
ToPathRelativeToFolder
ToPathWithLocalFolderPrefixIfRelative
Most of these methods or properties rely on what the proper directory separator for the platform is, and will do the right thing.
Now, sometimes you have the opposite scenario: you have paths that match a particular platform, and you need to work with them regardless of what platform your code is running on. For example, you might be reading a file format that contains Windows-style paths (such as Elements' own .elements
and .sln
project files). Or maybe you connect to a remote server via SSH from Windows, and need to deal with Unix-style paths as they are valid on the remote.
var lPath := SSH.GetRootPath
var lSubFolder := lPath.AppendUnixPath("sub", "folder");
SSH.cd(lSubFolder);
That's where the path APIs with Windows
and Unix
in the name come in. These will assume the path they are called on conforms to the specified platform, regardless of what platform the code is running on.
LastUnixPathComponent
LastWindowsPathComponent
LastUnixPathComponentWithoutExtension
LastWindowsPathComponentWithoutExtension
AppendUnixPath
AppendWindowsPath
IsAbsoluteUnixPath
IsAbsoluteWindowsPath
Finally, there's APIs to convert paths from one style to the other. Of course, whether and how that makes sense depends a lot on the context, but it actually more common that one would think.
Convert a local path format to a well-known format (if necessary):
ToWindowsPath
ToUnixPath
Convert from a well-known format to the local format (if necessary).
ToPlatformPathFromWindowsPath
ToPlatformPathFromUnixPath
And finally, convert from on well-known path format to the other:
ToUnixPathFromWindowsPath
ToWindowsPathFromUnixPath
Of course any of the first four of these methods might be a no-op on a given platform. (for example, ToPlatformPathFromUnixPath
has nothing to do on Unix, nor does ToUnixPath
). But using them consistently ensures that code will port cleanly to Windows (or vice versa).