当我在 Dart 中实例化一个目录并且该文件存在时,我如何检查该目录是一个真正的文件夹,还是只是一个符号链接?
4 回答
您可以识别符号链接的方式是路径是否与完整路径不同。Directory 没有fullPath()
or fullPathSync()
,但File.fullPathSync()
适用于目录。所以你可以这样做:
bool maybeIsSymlink(String path) {
var fullPath = new File(path).fullPathSync();
return path != fullPath;
}
然而,这只在path
绝对的情况下才能正常工作,并且它的祖先都不是符号链接。要解决这个问题,您可以获取目录父级的完整路径,附加目录名称并进行比较:
bool isSymlink(String pathString) {
var path = new Path(path);
var parentPath = path.directoryPath;
var fullParentPath = new File.fromPath(parentPath).fullPathSync();
var expectedPath = new Path(fullParentPath).append(path.filename).toString();
var fullPath = new File.fromPath(path).fullPathSync();
return fullPath != expectedPath;
}
请注意,我没有对此进行测试,但我在 Dart 中处理了很多符号链接,这应该可以工作。如果pathString
以“/”结尾,则必须将其删除。我通常最终从目录列表中获取路径,因此我在递归目录结构时跟踪预期路径。
您可以在 buildtool 的一个分支中看到listDirectory()
检测符号链接并将Symlink
实例与File
s 和s 一起发送到流的特殊实现: https ://github.com/dart-lang/buildtool/blob/m4/lib/src/util/ io.dartDirectory
在最前沿,现在有一个静态 FileSystemEntity.isLinkSync(path) 方法可以告诉您某物是否是符号链接;当它是一个损坏的符号链接时也是如此。
http://api.dartlang.org/docs/bleeding_edge/dart_io/FileSystemEntity.html
对于链接上的操作,我们添加了一个 Link 类。代码现在可供审查:
如果您想从命令行检查以验证正在发生的事情,请 ls -al DIRNAME 并在权限部分检查“l”,并检查输出右侧“指向”的内容。
另见人 1 统计
如果您想从 Dart 内部进行检查,我不知道该怎么做。
FileSystemEntity.typeSync(path)
FileSystemEntityType
使用其中一个值返回一个
FileSystemEntityType.DIRECTORY
FileSystemEntityType.FILE
FileSystemEntityType.LINK
FileSystemEntityType.NOT_FOUND