📁

TypedFilePath 1.3.0 を公開

2023/03/10に公開

TypedFilePath のバージョン 1.3.0 を公開しました!

TypedFilePathは、C#でコーディングする際にファイルパスを型安全に扱うためのライブラリです。

ファイルパスを文字列で扱っていると、そのパスがディレクトリを指すのかファイルを指すのか、絶対パスなのか相対パスなのか、拡張子がついているのかどうかが曖昧になることがあります。

プログラマーにとってファイルパスの正体が明らかな場合、TypedFilePathを使ってファイルパスの種類を型で明示しましょう。

// ディレクトリへの絶対パスであることを保証する
IAbsoluteDirectoryPath directory = "C:/Hoge/Fuga".AssertAbsoluteDirectoryPath();

// ファイルへの相対パスであることを保証する
IRelativeFilePath file = "Foo/Bar.txt".AssertRelativeFilePath();

// ファイルパスを結合する
IAbsoluteFilePath absoluteFile = directory.Combine(file);

追加された機能

パスの最後の部分を取得する

ファイルパスが与えられたとき、そこからファイル名だけを抜き出したい場合があります。1.3.0から、GetLastSegment メソッドを使って適切な型を保ちながらファイル名を抜き出すことができます。

var absoluteFile = "C:/Hoge/Fuga/Piyo.txt".AssertAbsoluteFilePath();
IRelativeFilePath absoluteDir = absoluteFile.GetLastSegment();

// ファイル名が取得できる。
Assert.Equal("Piyo.txt", absoluteDir.PathString);
var relativeFile = "./Hoge/Fuga/Piyo.txt".AssertRelativeFilePath();
IRelativeFilePath relativeDir = relativeFile.GetLastSegment();

// ファイル名が取得できる。
Assert.Equal("Piyo.txt", relativeDir.PathString);

どのようなファイルパスも、最後の部分だけを抜き出すと IRelativeFilePath 型になります。現状、最後のディレクトリパスを抜き出す機能がありません。

親ディレクトリパスを取得する

ファイルやディレクトリのパスが与えられたとき、そこから親ディレクトリのパスを得たい場合があります。1.3.0から、GetParentPath メソッドを使って適切な型を保ちながら親ディレクトリのパスを取得できます。

// 絶対ファイルパス -> 絶対ディレクトリパス
var absoluteFile = "C:/Hoge/Fuga/Piyo.txt".AssertAbsoluteFilePath();
IAbsoluteDirectoryPath? absoluteParent = absoluteFile.GetParentPath();

// 親ディレクトリへのパスが取得できた。
Assert.Equal("C:/Hoge/Fuga", absoluteParent?.PathString);
// 相対ディレクトリパス -> 相対ディレクトリパス
var relativeDir = "./Hoge/Fuga/".AssertRelativeDirectoryPath();
IRelativeDirectoryPath? relativeParent = relativeDir.GetParentPath();

// 親ディレクトリへのパスが取得できた。
Assert.Equal("Hoge", relativeParent.PathString);

親ディレクトリを取得する機能なので、 GetParentPath メソッドの戻り値は必ず IDirectoryPath 型です。

ドット2つ(..)の記法を処理する

今までのバージョンでは、上位ディレクトリへ遡ることを意味するドット2つ(..)の部分がパスに含まれていてもディレクトリ名として扱っていました。

旧バージョンの挙動
var path1 = "Hoge/Fuga/".AssertRelativeDirectoryPath();
var path2 = "../../Foo/Bar".AssertRelativeDirectoryPath();
var combined = path1.Combine(path2);

// ".." がそのままパスに含まれている。
Assert.Equal("Hoge/Fuga/../../Foo/Bar", combined.PathString);

この挙動が望ましい場面はないと思うので、ドット2つの部分は実際にパスを遡ったパスに必ず変換されるようにしました。

1.3.0の挙動
var path1 = "Hoge/Fuga/".AssertRelativeDirectoryPath();
var path2 = "../../Foo/Bar".AssertRelativeDirectoryPath();
var combined = path1.Combine(path2);

// Hoge/Fuga/ と ../../ が打ち消しあった
Assert.Equal("Foo/Bar", combined.PathString);

これは文字列を型付きファイルパスに変換する際にも処理されます。

var path = "C:/Hoge/../Piyo/".AssertDirectoryPath();
Assert.Equal("C:/Piyo", path.PathString);

Unity?

Unity向けのUPMパッケージもアップデート予定です。

2023/03/10 時点での最新UPMパッケージは upm-v1.0.0 ですが、新しく upm-v1.1.0 として提供する予定です。

Discussion