String resolveSymbolicLinksSync( )

Resolves the path of a file system object relative to the current working directory, resolving all symbolic links on the path and resolving all .. and . path segments.

resolveSymbolicLinksSync uses the operating system's native file system API to resolve the path, using the realpath function on linux and OS X, and the GetFinalPathNameByHandle function on Windows. If the path does not point to an existing file system object, resolveSymbolicLinksSync throws a FileSystemException.

On Windows the .. segments are resolved before resolving the symbolic link, and on other platforms the symbolic links are resolved to their target before applying a .. that follows.

To ensure the same behavior on all platforms resolve .. segments before calling resolveSymbolicLinksSync. One way of doing this is with the Uri class:

var path = Uri.parse('.').resolveUri(new Uri.file(input)).toFilePath();
if (path == '') path = '.';
var resolved = new File(path).resolveSymbolicLinksSync();
print(resolved);

since Uri.resolve removes .. segments. This will result in the Windows behavior.

Source

/**
 * Resolves the path of a file system object relative to the
 * current working directory, resolving all symbolic links on
 * the path and resolving all `..` and `.` path segments.
 *
 * [resolveSymbolicLinksSync] uses the operating system's native
 * file system API to resolve the path, using the `realpath` function
 * on linux and OS X, and the `GetFinalPathNameByHandle` function on
 * Windows. If the path does not point to an existing file system object,
 * `resolveSymbolicLinksSync` throws a `FileSystemException`.
 *
 * On Windows the `..` segments are resolved _before_ resolving the symbolic
 * link, and on other platforms the symbolic links are _resolved to their
 * target_ before applying a `..` that follows.
 *
 * To ensure the same behavior on all platforms resolve `..` segments before
 * calling `resolveSymbolicLinksSync`. One way of doing this is with the `Uri`
 * class:
 *
 *     var path = Uri.parse('.').resolveUri(new Uri.file(input)).toFilePath();
 *     if (path == '') path = '.';
 *     var resolved = new File(path).resolveSymbolicLinksSync();
 *     print(resolved);
 *
 * since `Uri.resolve` removes `..` segments. This will result in the Windows
 * behavior.
 */
String resolveSymbolicLinksSync() {
  var result = _resolveSymbolicLinks(path);
  _throwIfError(result, "Cannot resolve symbolic links", path);
  return result;
}