Search code examples
dartdart-iodart-mirrors

Reading static files under a library in Dart?


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/.


Solution

  • 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;
    }