【发布时间】:2016-08-22 16:39:33
【问题描述】:
当我在 Dart 中实例化一个目录并且该文件存在时,我如何检查该目录是一个真正的文件夹,还是只是一个符号链接?
【问题讨论】:
-
不支持符号链接。您无法创建这些,也无法检查条目是否为符号链接。考虑提交一个新的错误。 Pub 包管理器使用命令行来创建符号链接。
当我在 Dart 中实例化一个目录并且该文件存在时,我如何检查该目录是一个真正的文件夹,还是只是一个符号链接?
【问题讨论】:
您可以识别符号链接的方式是路径是否不同于完整路径。目录没有fullPath() 或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 实例与 Files 和 Directorys 一起发送到流:https://github.com/dart-lang/buildtool/blob/m4/lib/src/util/io.dart
【讨论】:
在最前沿,现在有一个静态 FileSystemEntity.isLinkSync(path) 方法可以告诉您某物是否是符号链接;当它是一个损坏的符号链接时也是如此。
http://api.dartlang.org/docs/bleeding_edge/dart_io/FileSystemEntity.html
对于链接上的操作,我们添加了一个 Link 类。代码现已发布以供审核:
【讨论】:
如果您想从命令行检查以验证发生了什么, ls -al DIRNAME 并检查权限部分中的“l”,并检查输出右侧“指向”的内容。
参见 man 1 stat
如果你想从 Dart 内部检查,我不知道怎么做。
【讨论】:
FileSystemEntity.typeSync(path)
返回一个带有其中一个值的FileSystemEntityType
FileSystemEntityType.DIRECTORYFileSystemEntityType.FILEFileSystemEntityType.LINKFileSystemEntityType.NOT_FOUND【讨论】: