DOBON.NET DOBON.NETプログラミング掲示板過去ログ

日本語を含む絶対パスから相対パスを取得するには

環境/言語:[XP Home VB.NET2003 .NET Framework1.1]
分類:[.NET]

いつも勉強させていただいております。
この度、「相対パスから絶対パスを取得する、絶対パスから相対パスを取得する」
http://dobon.net/vb/dotnet/file/getabsolutepath.html
を参考(というかそのままですが)に、相対パスを取得するコードを書きました。

Dim uriRoot As Uri = New Uri("C:\data\TEST\日本.mpg")
Dim uriPath As Uri = New Uri(uriRoot, "C:\data")
Return uriRoot.MakeRelative(uriPath)

すると、戻り値が "data/TEST/%E6%97%A5%E6%9C%AC.mpg" になります

Uri を利用しているので、日本語表記に変換がかかってるのだろうなあ、と想像したもののナニを糸口に調べていけばいいのか見当がつかず、困っております。

ご教授願います。
HttpUtility クラスの UrlDecode メソッドを使用すればお望みの結果になるかと思います。

POSTによりファイルをダウンロードし表示する
http://dobon.net/vb/dotnet/internet/webrequestpost.html

にも書かれているように HttpUtility クラス を使用するには System.Web.dll を参照する
必要がありますので、その点だけご注意くださいませ。



#どーでもツッコミ
>     Dim uriRoot As Uri = New Uri("C:\data\TEST\日本.mpg")
>     Dim uriPath As Uri = New Uri(uriRoot, "C:\data")
>     Return uriRoot.MakeRelative(uriPath)
> すると、戻り値が "data/TEST/%E6%97%A5%E6%9C%AC.mpg" になります

 この結果を得るのは uriRoot と uriPath が逆のとき‥‥ではないでしょうか?
■No11173に返信(深山さんの記事)
>  HttpUtility クラスの UrlDecode メソッドを使用すればお望みの結果になるかと思います。

ありがとうございます。あっさりと解決いたしました。
使用環境はXPのみの予定なので、大丈夫です。
下記のように修正いたしました。

Dim uriRoot As Uri = New Uri(ROOT_PATH)
Dim uriPath As Uri = New Uri(uriRoot, PATH)

'相対パスを取得
rtnPath = uriRoot.MakeRelative(uriPath)

'デコード
rtnPath = System.Web.HttpUtility.UrlDecode(rtnPath)

'区切り文字が\ではなく/なので置換する
rtnPath = rtnPath.Replace("/", "\")

> #どーでもツッコミ
>> Dim uriRoot As Uri = New Uri("C:\data\TEST\日本.mpg")
>> Dim uriPath As Uri = New Uri(uriRoot, "C:\data")
>> Return uriRoot.MakeRelative(uriPath)
>>すると、戻り値が "data/TEST/%E6%97%A5%E6%9C%AC.mpg" になります
>
>  この結果を得るのは uriRoot と uriPath が逆のとき‥‥ではないでしょうか?
ご指摘ありがとうございます。
用件が通じたからよかったようなものの・・・申し訳ありません。
気を付けます。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板