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;
});
}