v.next interface for package:file/file.dart (#7)

* v.next interface for package:file/file.dart

This changes the interface to chiefly expose the FileSystem
abstraction and deal in native dart:io types where at all possible:

- Expose all dart:io file-system static methods as instance methods
  on `FileSystem`, to allow injectable implementations (e.g. in-memory,
  local, mock, etc.)
- Create FileSystemEntity, File, Directory, Link as abstract classes
  that implement their native counterparts and add any extra methods
  we choose in this library (initially, only `get fileSystem => Filesystem`)

By going this route, it implies that each FileSystem implementation will
need to provide types that implement both the sync and async APIs (since
they implement the interfaces in native dart:io). However, I still plan
to provide SynchronousFileSystem & AsynchronousFileSystem, which will simply
throw UnsupportedError for the APIs they don't support.

This change will allow existing libraries/apps to seamlessly start using
FileSystem as a drop-in replacement for existing direct dart:io usage.
9 files changed
tree: 5b93a58592d9b3c29388d6a8c3c4a27cf7d66b89
  1. contrib/
  2. lib/
  3. test/
  4. tool/
  5. .analysis_options
  6. .gitignore
  7. .travis.yml
  8. CHANGELOG.md
  9. LICENSE
  10. pubspec.yaml
  11. README.md
README.md

Build Status Coverage Status

File

A generic file system abstraction for Dart.

This package is currently experimental and subject to change

Like dart:io, package:file supplies a rich Dart-idiomatic API for accessing a file system.

Unlike dart:io, package:file:

  • Does not mix synchronous and asynchronous API in one. It is up to users to choose one, the other, or both.
  • Has explicit factory classes for different implementations.
  • Can be used to implement custom file systems.
  • Comes with in-memory implementation out-of-the-box, making it super-easy to test code that works with the file system.
  • Allows using multiple file systems simultaneously. A file system is a first-class object. Instantiate however many you want and use them all.

Usage

Implement your own custom file system:

import 'package:file/file.dart';

class FooBarFileSystem implements FileSystem { ... }

Use the in-memory file system:

import 'package:file/file.dart';

var fs = new InMemoryFileSystem();

Use the local file system (requires dart:io access):

import 'package:file/io.dart';

var fs = const LocalFileSystem();

The synchronous counterparts can be imported from:

// API and in-memory implementation
import `package:file/sync.dart`;
// Implementation based on "dart:io"
import `package:file/sync_io.dart`;