如何在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
- 文件(放在库中)。
我怎么能这样做?
答案 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
当您要引用其他文件的文件不在web
,example
,bin
,test
等顶级目录中时, ...在进入包目录之前,你必须先导航到顶部
这种方式可以在每个文件中使用当前应用程序包的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
中的说明使用rootBundleimport '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