0

当我在 Dart 中实例化一个目录并且该文件存在时,我如何检查该目录是一个真正的文件夹,还是只是一个符号链接?

4

4 回答 4

1

您可以识别符号链接的方式是路径是否与完整路径不同。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实例与Files 和s 一起发送到流的特殊实现: https ://github.com/dart-lang/buildtool/blob/m4/lib/src/util/ io.dartDirectory

于 2013-03-13T06:00:03.183 回答
1

在最前沿,现在有一个静态 FileSystemEntity.isLinkSync(path) 方法可以告诉您某物是否是符号链接;当它是一个损坏的符号链接时也是如此。

http://api.dartlang.org/docs/bleeding_edge/dart_io/FileSystemEntity.html

对于链接上的操作,我们添加了一个 Link 类。代码现在可供审查:

https://codereview.chromium.org/12691002

于 2013-03-14T06:59:03.037 回答
0

如果您想从命令行检查以验证正在发生的事情,请 ls -al DIRNAME 并在权限部分检查“l”,并检查输出右侧“指向”的内容。

另见人 1 统计

如果您想从 Dart 内部进行检查,我不知道该怎么做。

于 2013-03-12T23:21:43.333 回答
0
FileSystemEntity.typeSync(path)

FileSystemEntityType使用其中一个值返回一个

  • FileSystemEntityType.DIRECTORY
  • FileSystemEntityType.FILE
  • FileSystemEntityType.LINK
  • FileSystemEntityType.NOT_FOUND
于 2016-08-22T08:39:33.787 回答