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