Path Type

Pub Version Dart Package Docs License: Apache 2.0 Build Status

path_type introduces a robust path type, Path, supporting POSIX and Windows file systems. Instead of using String, use Path to handle file paths in a type-safe manner with methods that will never throw an exception. Path can be used easily in-place of or with the path package. Path is also zero runtime cost as it is implemented as an extension type of String.

Usage

import

import 'package:path_type/posix.dart'; // or
import 'package:path_type/windows.dart'; // or
import 'package:path_type/platform.dart'; // or, uses posix unless on windows

declaration

Path path1 = Path('/foo/bar');
Path path2 = 'bar'.asPath(); // or
Path path3 = './baz.txt' as Path; // or

convert back to string

Path path = Path('/foo/bar');
String string = path.string;

Create a path and perform basic operations:

import 'package:path_type/posix.dart';

void main() {
  var path = Path('/foo/bar/baz.txt');

  print('File name: ${path.fileName()}'); // Output: baz.txt
  print('Extension: ${path.extension()}'); // Output: txt
  print('Is absolute: ${path.isAbsolute()}'); // Output: true

  var parent = path.parent();
  if (parent.isSome()) {
    print('Parent: ${parent.unwrap()}'); // Output: /foo/bar
  }

  var newPath = path.withExtension('md');
  print('New path with extension: $newPath'); // Output: /foo/bar/baz.md
}

Get the components of a path:

void main() {
  var path = Path('/foo/bar/baz.txt');
  var components = path.components().toList();

  for (var component in components) {
    print(component); // Output: /, foo, bar, baz.txt
  }
}

Retrieve all ancestors of a path:

void main() {
  var path = Path('/foo/bar/baz.txt');

  for (var ancestor in path.ancestors()) {
    print(ancestor);
    // Output:
    // /foo/bar/baz.txt
    // /foo/bar
    // /foo
    // /
  }
}

Check if a path exists and get metadata:

void main() {
  var path = Path('/foo/bar/baz.txt');

  if (path.existsSync()) {
    var metadata = path.metadataSync();
    print('File size: ${metadata.size}');
    print('Last modified: ${metadata.modified}');
  } else {
    print('Path does not exist.');
  }
}

For more operations see the documentation

Comparison To The Path Package

path_type has additional operations compared to the path package, see the documentation. Additionally, the path package works with String, while path_type uses Path to encapsulate the meaning through the type. Which provides clarity to developers and prevents misuse.

Example Ergonomic Difference

path_type

import 'package:path_type/posix.dart';

Path path1 = Path('/foo/bar');
Path path2 = Path('bar');
Path path3 = Path('./baz.txt');

Path path = path1.join(path2).join(path3);
print(path); // Output: /foo/bar/bar/./baz.txt

path

import 'package:path/path.dart' as p;

String path1 = '/foo/bar';
String path2 = 'bar';
String path3 = './baz.txt';

p.Context posix = p.Context(style: p.Style.posix);
var x = posix.joinAll([path1, path2, path3]);
print(x); // Output: /foo/bar/bar/./baz.txt

Libraries

platform
Path following windows specification on windows, follows posix otherwise
posix
Path following posix specification
windows
Path following windows specification