System.IO.Path.GetPathRoot 関数
指定したパス文字列の中からルートパスを返します。
つまりファイルがあるドライブを取得することができます。
public static string System.IO.Path.GetPathRoot(string path)
path が null の場合は null。
path にルート ディレクトリ情報が含まれていない場合は空の文字列。
サンプル
private string GetRootPathFromFullPath(string file)
{
//ファイルのルートパスを取得
return System.IO.Path.GetPathRoot(file);
}

こんな関数はいかがでしょうか?その1
System.IO.Path.GetPathRoot 関数自体はファイル存在チェックを行いません。文字列からルートパスだと思われる個所を抜き出すだけです。
ファイル存在チェックと併用してファイルが存在しない場合は空文字を返すようにしました。
関数例
private string GetRootPathFromFullPath(string file)
{
try
{
//ファイルが存在しない場合は、空文字を返す
if (System.IO.File.Exists(file) == false)
{
return "";
}
//ファイルのルートパスを取得
return System.IO.Path.GetPathRoot(file);
}
catch(Exception ex)
{
//異常が発生したときは、エラーメッセージを返す
return ex.Message;
/*
//異常が発生した場合も空文字を返すようにしておく
return "";
*/
}
}
例外発生時の対応は、お好きなほうを使っていただければと思います。
使用例
//ファイル名からフォルダ名を取得する
this.RootPathTextbox.Text = GetRootPathFromFullPath(this.PathTextbox.Text);
実行結果

こんな関数はいかがでしょうか?その2
ルートパスの取得が成功か失敗かを判別したい場合にはこんな感じにするといいと思います。
関数例
/// <summary>
/// パスよりルートパスを取得します。
/// </summary>
/// <param name="path">ルートパスを取得したいパス</param>
/// <param name="result">
/// [true]の場合はルートパスが入る
/// [false]の場合はエラーメッセージが入る</param>
/// <returns>true/false</returns>
private bool GetRootPathFromFullPath(string path, out string result)
{
result = "";
try
{
//パスがnull,空、空白のみの場合は、エラーメッセージを返す
if (String.IsNullOrWhiteSpace(path) == true)
{
result = "渡されたパスが空です。";
return false;
}
//ファイルまたはパスが存在しない場合は、エラーメッセージを返す
if (System.IO.File.Exists(path) == false && System.IO.Directory.Exists(path) == false)
{
result = "ファイルまたはパスが存在しません。";
return false;
}
//ファイルのルートパスを取得
result = System.IO.Path.GetPathRoot(path);
return true;
}
catch (Exception ex)
{
//異常が発生したときは、エラーメッセージを返す
result = ex.Message;
return false;
}
}
使用例
string result;
//ルートパス初期化
this.RootPathTextbox.Text = "";
if (GetRootPathFromFullPath(this.PathTextbox.Text, out result) == false)
{
//ルートパスの取得に失敗すればresultの中にはエラーメッセージが入っている
MessageBox.Show(result);
return;
}
//ルートパスの取得に成功すればresultの中にはルートパスが入っている
this.RootPathTextbox.Text = result;
実行結果

まとめ
ルートパスを取得するだけであればSystem.IO.Path.GetPathRoot関数だけでいいのですが、もし存在チェックや空文字チェックを行った後にルートパスを取得するようにしたい場合など、別の処理を追加するとなった時に修正箇所が多いと大変です。そのためあらかじめ関数化しておいて修正する箇所は少なくなるようにしましょう。
上記の例のようにあらかじめ関数にしておけば追加処理は、関数の中を修正すればすべて変更されます。


コメント