- 締切済み
C# 2つのフォルダの相対パスを求めたいが…
お世話になります。 二つのフォルダの相対パスを求めるメソッドを組みたいのですが、 MakeRelativeUriメソッドを使用すると実行時にどうしても InvalidOperationExceptionが出てしまいます。 下記がそのソースです。 string stPath = "C:/a/~~~"; stPath = stPath.Replace("/","\\"); Uri uri = new Uri(Path.GetFullPath(stPath + "\\")); // ディレクトリをと取得 string[] stDirectories = Directory.GetDirectories(stPath); foreach (string s in stDirectories) { string st = s.Replace("/", "\\"); Uri uri2 = new Uri(Path.GetFullPath(st + "\\")); Uri uri3 = uri2.MakeRelativeUri(uri); } 他のサイト様を拝見して、気を付けている点は、 1、相対ではなく、絶対で指定する。 2、末尾に"\\"を付ける。 3、"/"ではなく、"\\"に変更する の3点です。 それとも、MakeRelativeUriメソッドはフォルダには使えないのでしょうか? それとも、パスの中に2バイト文字が入っていてはダメ? 解決策をお願いいたします。 VC#2010Expressです。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Yune-Kichi
- ベストアンサー率74% (465/626)
Uri.MakeRelativeUriも頑張れば使えないことはないと思いましたが……。 P/Invokeで,PathRelativePathTo APIを呼び出すのが確実な方法かと。 http://msdn.microsoft.com/en-us/library/windows/desktop/bb773740(v=vs.85).aspx
- Wr5
- ベストアンサー率53% (2173/4061)
特に例外は発生しませんでしたけどね……。 >Uri uri = new Uri(Path.GetFullPath(stPath + "\\")); の時点で、"file:///"が付与されたURIになっていました。 >Uri uri3 = uri2.MakeRelativeUri(uri); で、常に"../"とか返されませんでした。 # file:///などは付かない。 >それとも、パスの中に2バイト文字が入っていてはダメ? 2バイト文字というか… 「Microsoft 圧縮 (LZH 形式) フォルダ」とか入っていましたけど普通に動作していましたねぇ……。 例外が発生した時のuri2がどんな値になっていたのか…とかの情報が必要なんじゃないですかね? string[] stDirectoriesはstring型ですし、Shift-JISとか絡むとも思えませんが……。 http://dobon.net/vb/dotnet/file/getabsolutepath.html URLデコードされた…とか、"\\"がエスケープ文字としてUriのコンストラクタで処理されてしまった…とかでしょうかねぇ? ただ、まぁ、なにがやりたいのかイマイチよく判りませんけど……。 # 相対パスを得たいだけ??
お礼
ありがとうございました。
- chie65536(@chie65535)
- ベストアンサー率44% (8800/19958)
MakeRelativeUriメソッドは、 uriが「http://www.foober.com/」を示している時に、パラメータに「http://www.foober..com/test/test.htm」を与えた時に「test/test.htm」を得る と言う場合に使います。 ローカルフォルダに対しては、このメソッドは使用できません。 ローカルフォルダを「file://C|/a/~~~」のように、URI化させれば使えるかも知れませんが、試してないので判りません。 試してないので、URI化して使えたとしても「../../a/~~~」のような相対パス表記の文字列が得られるかどうかは判りません。
お礼
ありがとうございました。
お礼
ありがとうございました。