ファイルパスの文字列を扱いやすくするためのライブラリです。
ファイルパスの持つ性質を以下のように型で表現します。
NuGet Packageで利用可能です。
Unityからも利用可能です。 以下のgit urlをPackage Managerで指定してください。
https://github.com/NumAniCloud/Numani.TypedFilePath.git#upm-v1.0.0
いくつかのファクトリーメソッドを持ちます。これにより、string
型で表現されたパスから、各種インターフェース型を実装するオブジェクトを生成できます。
また、カレントディレクトリのパスを取得する機能、パスを結合する機能があります。
以下のようなインターフェースがあります。
IFileSystemPath
IFilePath
IDirectoryPath
IFilePathWithExtension
IRelativePath
IAbsolutePath
これらを合成したインターフェースがあります。
IRelativeFilePath
IRelativeFilePathExt
IAbsoluteFilePath
IAbsoluteFilePathExt
IRelativeDirectoryPath
IAbsoluteDirectoryPath
ライブラリのユーザーはこれらインターフェース型にのみアクセスでき、具体的な型は内部に閉じ込められています。
AssertRelativeFilePathExt
拡張メソッドなどを用いて、文字列を型付きファイルパスのオブジェクトに変換することができます。
IRelativeFilePathExt path = ".\\Hoge\\Fuga.txt".AssertRelativeFilePathExt();
一度型つきファイルパスに変換したなら、その後は型つきファイルパス → 型つきファイルパス
の変換メソッドを使ってファイルパスを扱うことができます。
また、変換用の拡張メソッドは、文字列の形式が対象の型に合わない場合に例外を発生させます。
// カレントディレクトリからの相対ファイルパスを絶対ファイルパスに変換しようとしているので、例外が投げられる
IAbsoluteFilePath path = ".\\Hoge\\Fuga.txt".AssertAbsoluteFilePath();
型つきファイルパスどうしを結合することができます。
IRelativeDirectoryPath dir = ".\\Hoge\\Fuga".AssertRelativeDirectoryPath();
IRelativeFilePath file = "file.txt".AssertRelativeFilePath();
// "./Hoge/Fuga/file.txt" と表示される
Console.WriteLine(dir.Combine(file).PathString);
ファイルパスに拡張子を付けたり外したりできます。
var file = "README".AssertRelativeFilePath();
var withExt = file.WithExtension(new FileExtension(".md"));
// "README.md" と表示される
Console.WriteLine(withExt.PathString);
var file = "README.md".AssertRelativeFilePathExt();
var without = file.WithoutExtension();
// "README" と表示される
Console.WriteLine(without.PathString);
型つきファイルパスから直接ファイルを操作することもできます。
var file = "README.md".AssertRelativeFilePath();
// ファイルが存在するかどうか確認
if (!file.Exists())
{
// ファイルを作成する
using var stream = file.OpenCreate();
}
IDirectoryPath.EnumerateFiles
メソッドを使って、ディレクトリ内のファイルパスを型付きで列挙することができます。
IDirectoryPath.EnumerateDirectories
メソッドを使って、ディレクトリ内のディレクトリを型付きで列挙することができます。
文字列を型付きファイルパスに変換するとき、失敗した場合に例外を投げる以外の処理をしたいときにはパターンマッチングを使う方法があります。
if ("Readme.md".AsAnyPath() is not IRelativeFilePath relative)
{
return;
}
Console.WriteLine(relative.PathString);