1. ホーム
  2. c#

現在の作業ディレクトリからの相対パスを取得する?重複

2023-07-11 07:04:32

質問

私は、コマンドラインで指定されたファイルに対していくつかの処理を行うコンソールユーティリティを書いていますが、Google/Stack Overflowで解決できない問題に遭遇しました。ドライブ文字を含むフル パスが指定された場合、そのパスを現在の作業ディレクトリへの相対パスとして再フォーマットするにはどうすればよいですか?

VirtualPathUtility.MakeRelative 関数と同様のものがあるに違いありませんが、もしあるならば、それは私にはわかりません。

どのように解決するのですか?

スラッシュが入れ替わっても構わないのであれば、[ab]で Uri :

Uri file = new Uri(@"c:\foo\bar\blop\blap.txt");
// Must end in a slash to indicate folder
Uri folder = new Uri(@"c:\foo\bar\");
string relativePath = 
Uri.UnescapeDataString(
    folder.MakeRelativeUri(file)
        .ToString()
        .Replace('/', Path.DirectorySeparatorChar)
    );

関数・メソッドとして

string GetRelativePath(string filespec, string folder)
{
    Uri pathUri = new Uri(filespec);
    // Folders must end in a slash
    if (!folder.EndsWith(Path.DirectorySeparatorChar.ToString()))
    {
        folder += Path.DirectorySeparatorChar;
    }
    Uri folderUri = new Uri(folder);
    return Uri.UnescapeDataString(folderUri.MakeRelativeUri(pathUri).ToString().Replace('/', Path.DirectorySeparatorChar));
}