// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'dart:io' as dart_io; import 'package:file/io.dart'; import 'package:file/sync_io.dart'; import 'package:path/path.dart' as path; export 'package:file/io.dart'; export 'package:file/sync_io.dart'; /// Currently active implmenetation of the file system. /// /// By default it uses local disk-based implementation. Override this in tests /// with [MemoryFileSystem]. FileSystem fs = new LocalFileSystem(); SyncFileSystem syncFs = new SyncLocalFileSystem(); typedef String CurrentDirectoryGetter(); final CurrentDirectoryGetter _defaultCurrentDirectoryGetter = () { return dart_io.Directory.current.path; }; /// Points to the current working directory (like `pwd`). CurrentDirectoryGetter getCurrentDirectory = _defaultCurrentDirectoryGetter; /// Exits the process with the given [exitCode]. typedef void ExitFunction([int exitCode]); final ExitFunction _defaultExitFunction = ([int exitCode]) { dart_io.exit(exitCode); }; /// Exits the process. ExitFunction exit = _defaultExitFunction; /// Restores [fs] and [syncFs] to the default local disk-based implementation. void restoreFileSystem() { fs = new LocalFileSystem(); syncFs = new SyncLocalFileSystem(); getCurrentDirectory = _defaultCurrentDirectoryGetter; exit = _defaultExitFunction; } /// Uses in-memory replacments for `dart:io` functionality. Useful in tests. void useInMemoryFileSystem({ String cwd: '/', ExitFunction exitFunction }) { MemoryFileSystem memFs = new MemoryFileSystem(); fs = memFs; syncFs = new SyncMemoryFileSystem(backedBy: memFs.storage); getCurrentDirectory = () => cwd; exit = exitFunction ?? ([int exitCode]) { throw new Exception('Exited with code $exitCode'); }; } /// Create the ancestor directories of a file path if they do not already exist. void ensureDirectoryExists(String filePath) { String dirPath = path.dirname(filePath); if (syncFs.type(dirPath) == FileSystemEntityType.DIRECTORY) return; syncFs.directory(dirPath).create(recursive: true); }