フルパスが欲しい §
WindowsのドキュメントフォルダにmySpecialDocument.txtというファイルが存在することが分かっています。
そして、都合上、このファイルのファイル名を示すフルパスの文字列が必要だとします。
どうすれば作成できるでしょう。
WindowsのドキュメントフォルダはEnvironment.GetFolderPath(Environment.SpecialFolder.MyDocuments);で取得できます。
やり方は複数ある §
第1のやり方が円記号(バックスラッシュ)を挟んで文字列の合体です。
しかし、お勧めはしません。円記号(バックスラッシュ)の利用はWindowsのファイルシステムのローカルルールだからです。.NET 5の時代、あなたが作ったプログラムはLinuxやMacで使われる可能性もあります。
第2のやり方は記号を直接書かず、Path.DirectorySeparatorCharを使う方法です。これはちょっと好ましいやり方です。少なくとも特定の記号はソース上に出現しません。
しかし、サンプルソースを見ると分かる通り長くなりすぎです。それに、今後出現するかもしれない特殊なルールには対応仕切れないかも知れません。
第3のやり方はPath.Combineメソッドの利用です。これはお勧めです。第1のやり方よりは長いとは言え、第2のやり方に比べれば大幅にコンパクトに記述できます。しかも、完全にパスの区切りがどういう構造化がCombineメソッド内に抽象化されており、ソース上に出て来ません。どんな環境でも動作する可能性が高い方法です。
第3のやり方、Path.Combineメソッドの利用が最もお勧めです。
罠の数々 §
- "a\b"と"c\d"をPath.Combineメソッドで連結すると"a\b/c\d"のような変なパスができることがある。パスの区切り記号はできるだけ直接書かないようにしたい
- とはいえ、その場で走らせるだけの使い捨てプログラムなら難しいことは考えなくてもいい。パスを直接書いてもたいてい問題はない。最終完成形のプログラムが特定のパス区切り文字に依存していなければ良いのだ
参考リンク §
Environment クラス
Path.DirectorySeparatorChar フィールド
Path.Combine メソッド
Path.Combine メソッドはとても便利である。引数にいくつ文字列を書いても良く、それらを全て連結したパスの文字列を作ってくれる。しかし、上記のリンクを見ると引数4個のバリエーションまでしか書かれていない。どうして、引数が5個でも動作するのだろうか。上記のリンクを辿って理由を調べてみよう。
リポジトリ §
https://github.com/autumn009/cshowto
path §
using System;
using System.IO;
class Program
{
static void Main()
{
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var filename = "mySpecialDocument.txt";
// 好ましくない方法
var path1 = docPath + "\\" + filename;
Console.WriteLine($"path1 = {path1}");
// ちょっと好ましい方法
var path2 = docPath + Path.DirectorySeparatorChar + filename;
Console.WriteLine($"path2 = {path2}");
// 好ましい方法
var path3 = Path.Combine(docPath, filename);
Console.WriteLine($"path3 = {path3}");
}
}
実行結果 (C:\Users\autumn.PDTOKYO4の部分は実行する環境次第で変化する)
path1 = C:\Users\autumn.PDTOKYO4\Documents\mySpecialDocument.txt
path2 = C:\Users\autumn.PDTOKYO4\Documents\mySpecialDocument.txt
path3 = C:\Users\autumn.PDTOKYO4\Documents\mySpecialDocument.txt