Чтение статических файлов в библиотеке в Dart?

Я пишу библиотеку в Dart, и у меня есть статические файлы в папке библиотеки. Я хочу иметь возможность читать эти файлы, но я не уверен, как получить к ним путь... там нет __FILE__ или $0, как в некоторых других языках.

Обновление: кажется, я недостаточно ясно выразился. Пусть это поможет вам понять меня:

test.dart

import 'foo.dart';

void main() {
  print(Foo.getMyPath());
}

foo.dart

library asd;

class Foo {
  static Path getMyPath() => new Path('resources/');
}

Это дает мне неправильное расположение папки. Он дает мне путь к test.dart + resources/, но я хочу путь к foo.dart + resources/.


person Tower    schedule 27.09.2012    source источник


Ответы (3)


Как уже упоминалось, вы можете использовать зеркала. Вот пример использования того, чего вы хотели достичь:

test.dart

import 'foo.dart';

void main() {
  print(Foo.getMyPath());
}

foo.dart

library asd;

import 'dart:mirrors';

class Foo {
  static Path getMyPath() => new Path('${currentMirrorSystem().libraries['asd'].url}/resources/');
}

Он должен вывести что-то вроде:

/Пользователи/Кай/тест/библиотека/ресурсы/

Вероятно, в будущих версиях будет лучший способ сделать это. Я обновлю ответ, когда это произойдет.

Обновление: вы также можете определить закрытый метод в библиотеке:

/**
 * Returns the path to the root of this library.
 */
_getRootPath() {
  var pathString = new Path(currentMirrorSystem().libraries['LIBNAME'].url).directoryPath.toString().replaceFirst('file:///', '');
  return pathString;
}
person Kai Sellgren    schedule 02.10.2012
comment
На самом деле у него есть имя файла в пути, но это незначительная проблема. - person Tower; 02.10.2012

API зеркал dart (все еще экспериментальный и пока не доступный на всех платформах, таких как dart2js) предоставляет геттер url в LibraryMirror. Это должно дать вам то, что вы хотите.

Я не знаю другого способа получить эту информацию о библиотеке.

#import('dart:mirrors');
#import('package:mylib/mylib.dart'); 

main(){
   final urlOfLib = currentMirrorSystem().libraries['myLibraryName'].url;
}
person John Evans    schedule 01.10.2012

Как правило, обычный метод доступа к ресурсам, которые находятся в статической позиции вашей библиотеки, — это использование относительного пути.

#import('dart:io');

...

var filePath = new Path('resources/cool.txt');
var file = new File.fromPath(filePath);

// And if you really wanted, you can then get the full path
// Note: below is for example only. It is missing various
// integrity checks like error handling.
file.fullPath.then((path_str) {
  print(path_str);
});

См. дополнительную информацию об API на странице Path и на странице Файл

В стороне. Если вы абсолютно хотите получить тот же тип вывода, что и __FILE__, вы можете сделать что-то вроде следующего:

#import('dart:io');
...
var opts = new Options();
var path = new Path(opts.script);
var file = new File.fromPath(path);
file.fullPath().then((path_str) {
  print(path_str);
});
person Matt B    schedule 27.09.2012
comment
Вы знаете, что это не работает. Потому и задаю вопрос изначально. Первый пример кода будет искать папку resources в том месте, где был расположен исходный скрипт, а не там, где находится текущий исполняемый файл кода. Та же проблема и со вторым примером кода, он дает мне test.dart в качестве файла (как и должно быть), но не another.dart, который был импортирован в test.dart. - person Tower; 29.09.2012