resolveSymbolicLinks 方法

Future<String> resolveSymbolicLinks()

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

解析路径上的所有符号链接以及所有 ... 路径段。

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

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

为确保所有平台上的行为一致,在调用 resolveSymbolicLinks 之前解析 .. 段。一种方法是用 Uri

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

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

在 Windows 上,如果尝试解析符号链接,其中链接类型与解析的文件系统对象类型不匹配,将导致 Future 以 PathAccessException 错误完成。

实现

Future<String> resolveSymbolicLinks() {
  return _File._dispatchWithNamespace(
      _IOService.fileResolveSymbolicLinks, [null, _rawPath]).then((response) {
    _checkForErrorResponse(response, "Cannot resolve symbolic links", path);
    return response as String;
  });
}