resolveSymbolicLinksSync 方法

String resolveSymbolicLinksSync()

相对于当前工作目录解析文件系统对象的路径。

解析路径上的所有符号链接,并解析所有 ... 路径段。

resolveSymbolicLinksSync 使用操作系统的原生文件系统 API 来解析路径,在 Linux 和 OS X 上使用 realpath 函数,在 Windows 上使用 GetFinalPathNameByHandle 函数。如果路径不指向现有的文件系统对象,resolveSymbolicLinksSync 会抛出 FileSystemException

在 Windows 上,.. 段在解析符号链接之前解析,而在其他平台上,先解析符号链接到其目标,然后再应用后续的 ..

为了确保所有平台上的相同行为,在调用 resolveSymbolicLinksSync 之前解析 .. 段。这样做的一种方法是使用 Uri

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

因为 Uri.resolve 会去除 .. 段。这会导致 Windows 的行为。

在 Windows 上,符号链接作为文件链接或目录链接创建。尝试解析这种符号链接需要链接类型与所指向的文件系统对象的类型匹配,否则会抛出 PathAccessException

实现

String resolveSymbolicLinksSync() {
  var result = _resolveSymbolicLinks(_Namespace._namespace, _rawPath);
  _throwIfError(result, "Cannot resolve symbolic links", path);
  return result;
}