Reading static files under a library in Dart?

2019-04-14 02:08发布

问题:

I am writing a library in Dart and I have static files under the library folder. I want to be able to read those files, but I'm not sure how to retrieve the path to it... there is not __FILE__ or $0 like in some other languages.

Update: It seems that I was not clear enough. Let this help you understand me:

test.dart

import 'foo.dart';

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

foo.dart

library asd;

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

It gives me the wrong folder location. It gives me the path to test.dart + resources/, but I want the path to foo.dart + resources/.

回答1:

As mentioned, you can use mirrors. Here's an example using what you wanted to achieve:

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/');
}

It should output something like:

/Users/Kai/test/lib/resources/

There will probably be a better way to do this in a future release. I will update the answer when this is the case.

Update: You could also define a private method in the library:

/**
 * Returns the path to the root of this library.
 */
_getRootPath() {
  var pathString = new Path(currentMirrorSystem().libraries['LIBNAME'].url).directoryPath.toString().replaceFirst('file:///', '');
  return pathString;
}


回答2:

The dart mirrors API (still experimental, and not available on all platforms such as dart2js yet) exposes a url getter on the LibraryMirror. This should give you what you want.

I'm not aware of any other way to get this information on a library.

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

main(){
   final urlOfLib = currentMirrorSystem().libraries['myLibraryName'].url;
}


回答3:

Generally the usual method of accessing resources which are located at a static position with your library is by use using a relative path.

#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);
});

See addition API information on Path and on File

As an aside.. If you absolutely wanted to get the same type of output as __FILE__ you can do something like the following:

#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);
});