【问题标题】:How do I recognize a symlink in Dart when dealing with the Directory class?在处理 Directory 类时如何识别 Dart 中的符号链接?
【发布时间】:2016-08-22 16:39:33
【问题描述】:

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

【问题讨论】:

  • 不支持符号链接。您无法创建这些,也无法检查条目是否为符号链接。考虑提交一个新的错误。 Pub 包管理器使用命令行来创建符号链接。

标签: directory dart symlink


【解决方案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 以 '/' 结尾,则必须将其删除。我通常最终从目录列表中获取路径,因此我在递归目录结构时跟踪预期路径。

您可以在 buildtool 的一个分支中看到一个特殊的 listDirectory() 实现,它检测符号链接并将 Symlink 实例与 Files 和 Directorys 一起发送到流:https://github.com/dart-lang/buildtool/blob/m4/lib/src/util/io.dart

【讨论】:

    【解决方案2】:

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

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

    对于链接上的操作,我们添加了一个 Link 类。代码现已发布以供审核:

    https://codereview.chromium.org/12691002

    【讨论】:

      【解决方案3】:

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

      参见 man 1 stat

      如果你想从 Dart 内部检查,我不知道怎么做。

      【讨论】:

      • 谢谢,但我需要向 Dart 确认,是的。
      【解决方案4】:
      FileSystemEntity.typeSync(path)
      

      返回一个带有其中一个值的FileSystemEntityType

      • FileSystemEntityType.DIRECTORY
      • FileSystemEntityType.FILE
      • FileSystemEntityType.LINK
      • FileSystemEntityType.NOT_FOUND

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-22
        • 2012-03-13
        • 1970-01-01
        • 2011-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多