在处理Directory类时,如何识别Dart中的符号链接?

时间:2013-03-12 23:15:57

标签: directory dart symlink

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

4 个答案:

答案 0 :(得分:1)

识别符号链接的方式是路径是否与完整路径不同。目录没有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以'/'结尾,则必须将其删除。我通常最终从目录列表中获取路径,因此我在追踪目录结构时跟踪预期的路径。

您可以看到一个特殊的listDirectory()实现,它检测符号链接并将Symlink实例与buildtool中的分支中的FileDirectory一起发送到流:{ {3}}

答案 1 :(得分:1)

在最前沿,现在有一个静态的FileSystemEntity.isLinkSync(路径)方法,可以告诉你某些内容是否是符号链接;当它是一个破损的符号链接时。

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

对于链接上的操作,我们添加了一个Link类。该代码现在正在审核中:

https://codereview.chromium.org/12691002

答案 2 :(得分:0)

如果要从命令行检查以验证发生了什么, ls -al DIRNAME并在权限部分检查'l',并检查它在输出右侧指向“to”的内容。

另见man 1 stat

如果您想从Dart内部检查,我不知道如何。

答案 3 :(得分:0)

FileSystemEntity.typeSync(path)

使用其中一个值

返回FileSystemEntityType
  • FileSystemEntityType.DIRECTORY
  • FileSystemEntityType.FILE
  • FileSystemEntityType.LINK
  • FileSystemEntityType.NOT_FOUND