获取Dart中的脚本路径(PHP中的模拟__DIR__常量)

时间:2014-07-21 07:06:30

标签: dart

如何在Dart中获取当前脚本(不可执行)的路径?

例如。在PHP中,我们有__DIR__常量,这是对脚本目录的依赖。如果我们有两个脚本:./run.php./lib/test.php;在./run.php我们只包括./lib/test.php./lib/test.php输出__DIR__中的代码。如果我们运行./run.php,那么我们会输入/path/to/lib/test.php

在Dart中,我们可以获取当前运行脚本的目录,但是如何获取当前脚本的目录?

我需要这个,因为我试图从库中获取json - 文件(放在库中)。

我怎么能这样做?

3 个答案:

答案 0 :(得分:4)

您已经说过,当您运行test.dart时,当前目录为/path/to/lib/tests。因此,您应该能够使用相对路径来打开rules.json。路径为../rules/rules.json(当然,在Windows上为..\rules\rules.json,您可以从Platform.pathSeparator获取分隔符。

或者,显然您可以从Uri获取当前脚本的Platform.script(如果平台支持)。

答案 1 :(得分:2)

如果要引用lib目录中的文件,则使用包相对路径。

packages/my_package/lib/rules/rules.json

当您要引用其他文件的文件不在webexamplebintest等顶级目录中时, ...在进入包目录之前,你必须先导航到顶部 这种方式可以在每个文件中使用当前应用程序包的lib目录中的每个目标文件,或者在pubspec.yaml中声明为依赖项的任何包。

  ../packages/my_package/lib/rules/rules.json
当你没有足够的航行时,

pub build会给出提示。

实施例

包含main的文件位于playground/bin/script/script_path/main.dart
test.json文件位于playground/lib/some_json

import 'dart:io' as io;

main() {
  Uri filePath = io.Platform.script.resolve(
      '../../../packages/playground/some_json/test.json');
  var file = new io.File.fromUri(filePath);
  var content = file.readAsString().then((c) {
    print(c);
  });
}

在服务器上你不需要向上导航(至少是当前的),因为每个目录都有packages目录的符号链接,但是有计划摆脱符号链接和{{1}可能像dart2dart一样工作,并且可能需要像浏览器应用程序一样向上导航。

答案 2 :(得分:0)

如果您处于混乱的项目中并尝试加载静态资产,例如json,txt,图像:按照https://flutter.dev/docs/development/ui/assets-and-images#loading-text-assets

中的说明使用rootBundle
import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;

Future<String> loadAsset() async {
  return await rootBundle.loadString('assets/config.json');
}

还要确保将文件添加到pubspec.yaml

flutter:
  assets:
    - assets/config.json