例えば、「file:///c:/temp/doc.txt」のようなローカルファイルのパスを表すURIを、Windowsで使われる「c:\temp\doc.txt」という形式に変換する方法と、その逆を行う方法を紹介します。
URIをWindows形式のパスに変換する場合の正攻法は、変換したいURIからUriオブジェクトを作成し、そのLocalPathプロパティを取得するという方法です。ただしこの場合、URIに「#」が含まれているとLocalPathプロパティは「#」までの文字列しか返しません。
「#」以降の文字列は、Fragmentプロパティで取得できます。ただFragmentプロパティが返す文字列はURLエンコードされていますので、Uri.UnescapeDataStringメソッドなどを使ってデコードする必要があります。
なおUriクラスのプロパティについて詳しくは、「URLを解析する」をご覧ください。
以下に、「file:///c:/temp/doc.txt」を「c:\temp\doc.txt」に変換する例を示します。
'ローカルファイルのパスを表すURI Dim uriPath As String = "file:///c:/temp/doc.txt" 'Uriオブジェクトを作成する Dim u As New Uri(uriPath) '変換するURIがファイルを表していることを確認する If u.IsFile Then 'Windows形式のパス表現に変換する Dim winPath As String = u.LocalPath + Uri.UnescapeDataString(u.Fragment) '結果を表示する Console.WriteLine(winPath) 'c:\temp\doc.txt Else Console.WriteLine("ファイルURIではありません。") End If
//ローカルファイルのパスを表すURI string uriPath = "file:///c:/temp/doc.txt"; //Uriオブジェクトを作成する Uri u = new Uri(uriPath); //変換するURIがファイルを表していることを確認する if (u.IsFile) { //Windows形式のパス表現に変換する string winPath = u.LocalPath + Uri.UnescapeDataString(u.Fragment); //結果を表示する Console.WriteLine(winPath); //c:\temp\doc.txt } else { Console.WriteLine("ファイルURIではありません。"); }
Windows形式のパスをURIに変換する場合も、まずUriオブジェクトを作成してから、AbsoluteUriプロパティを取得します。
以下に、「c:\temp\doc.txt」を「file:///c:/temp/doc.txt」に変換する例を示します。
'Windows形式のファイルパス Dim winPath As String = "c:\temp\doc.txt" 'Uriオブジェクトを作成する Dim u As New Uri(winPath) 'Uriオブジェクトがファイルを表していることを確認する If u.IsFile Then 'Windows形式のパス表現に変換する Dim uriPath As String = u.AbsoluteUri '結果を表示する Console.WriteLine(uriPath) 'file:///c:/temp/doc.txt Else Console.WriteLine("ファイルURIではありません。") End If
//Windows形式のファイルパス string winPath = @"c:\temp\doc.txt"; //Uriオブジェクトを作成する Uri u = new Uri(winPath); //Uriオブジェクトがファイルを表していることを確認する if (u.IsFile) { //Windows形式のパス表現に変換する string uriPath = u.AbsoluteUri; //結果を表示する Console.WriteLine(uriPath); //file:///c:/temp/doc.txt } else { Console.WriteLine("ファイルURIではありません。"); }