• 締切済み

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です。

みんなの回答

回答No.3

Uri.MakeRelativeUriも頑張れば使えないことはないと思いましたが……。 P/Invokeで,PathRelativePathTo APIを呼び出すのが確実な方法かと。 http://msdn.microsoft.com/en-us/library/windows/desktop/bb773740(v=vs.85).aspx

tatapatank
質問者

お礼

ありがとうございました。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

特に例外は発生しませんでしたけどね……。 >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のコンストラクタで処理されてしまった…とかでしょうかねぇ? ただ、まぁ、なにがやりたいのかイマイチよく判りませんけど……。 # 相対パスを得たいだけ??

tatapatank
質問者

お礼

ありがとうございました。

  • chie65535
  • ベストアンサー率43% (8524/19373)
回答No.1

MakeRelativeUriメソッドは、 uriが「http://www.foober.com/」を示している時に、パラメータに「http://www.foober..com/test/test.htm」を与えた時に「test/test.htm」を得る と言う場合に使います。 ローカルフォルダに対しては、このメソッドは使用できません。 ローカルフォルダを「file://C|/a/~~~」のように、URI化させれば使えるかも知れませんが、試してないので判りません。 試してないので、URI化して使えたとしても「../../a/~~~」のような相対パス表記の文字列が得られるかどうかは判りません。

tatapatank
質問者

お礼

ありがとうございました。

関連するQ&A

  • 絶対パス・相対パス・ディレクトリ・について

    HTMLでホームページを作ろうとしている初心者です、教えてください 自分のホームページのフォルダの中ににリンクするパスの指定方法を相対パスというのはわかりましたが、画像を表示するためのパスの指定方法も相対パスでいいのでしょうか、それともディレクトリというんでしょうか?

  • 相対パスの指定

    FindFirstFile(), remove(), OPENFILENAME などのファイルやフォルダのパスを扱うものについて、例えば 実行ファイルと同じディレクトリに有るdat.datというファイルを「dat.dat」とだけ書いて相対指定したつもりが、実行ファイルと同じディレクトリにdat.datが無かった場合にWindowsフォルダなどの特殊なフォルダや、AUTOEXEC.BATに書いてあるフォルダを使ってdat.datが検索されて適用されたりすることはあるのでしょうか? いろいろな関数や構造体が有りますが、相対パスが指定されたとき、絶対パスを作るために使用されるフォルダパスが、GetCurrentDirectory()以外のものが使われることってあるんでしょうか?

  • 相対パスについて

    初歩的なことですみません。 相対パスについて教えてください。 <public_html>---<cgi-bin>---<ccc>---<ttt.pl> *************| *************---<eee>---<test.html> こちらの構成で、(***は無視してください。) (public_htmlの下はcgi-binとeeeフォルダです。) test.htmlから見た、ttt.plのパスは ../cgi-bin/ccc/ttt.pl  でよいのでしょうか?? CGIを設置する時、ディレクトリを変えたら、動かなくなってしまったので・・・ 宜しくお願いします。

    • 締切済み
    • CGI
  • CSSが反映されない(相対パスを使う?)

    FC2でホームページを作っています。 ROOTディレクトリには st.css、index.html などを作りました。そこにある全ての ページにCSSが反映されています。 その下の階層に imgディレクトリと、自分の書いた作品を入れるためのディレクトリを 作りました。imgディレクトリの中にはgif形式の画像(ホームページのレイアウトに使う画像) ファイルが入っています。 作品を入れているディレクトリのページを見ると、CSSが反映されておらず、 真っ白のページに文字が左詰めで書いてあるだけでした。 そこで、相対パスというものを使ってCSSを反映させたいです。 相対パスの説明サイトを見ても全く分かりませんでした。 特に、「./」の使い方が分からなかったです。これをどうやって使うのか? もしくは 別のを使うのか? 仮に「./」を使うとして、それをどこに書き込めばいいのかも分かりません。 <link rel="○○(反映させたいページ)/stylesheet" href="st.css" type="text/css"> これのどこかに書き込むと反映されるようになると説明があったのですが…。 ご回答をお願いします。

    • ベストアンサー
    • HTML
  • 読込ファイルのパスについて

     ファイルからテキストファイルを読み込んで、フォームから入力されたデータと照合し、ファイルにあればログインするというようなwebアプリを作ろうとしています。 しかし、テキストファイルが読み込まれてないようで、正しいパスワードを入力してもログインできません。読み込むファイルへのパス指定は絶対パスなのでしょうか、呼び出し元からの相対パスを指定するのでしょうか? また、テキストファイルを置くディレクトリは決まっているのでしょうか?(「WEB-INFより上の階層に置く」など) ちなみにサーバ環境はLinux+tomcat3.2.1+apache --------------------------------------------------------------- public class LoginDataBeans { ///////// UserDataクラス ///////// private class UserData{ public String user_id; public String password; } ///////// メンバ変数 ///////// ArrayList userList; private static final String logFilename = "/tomcat/logindata";←ここのパスは「絶対パス」?、それともこのファイルからの「相対パス」? ///////// コンストラクタ ///////// public LoginDataBeans(){ String item; userList = new ArrayList(); try{ BufferedReader in = new BufferedReader(new FileReader(logFilename)); while((item = (String)in.readLine()) != null){ UserData udat = new UserData(); StringTokenizer st = new StringTokenizer(item); udat.user_id = st.nextToken(); udat.password = st.nextToken(); userList.add(udat); } in.close(); } catch(IOException e){ e.printStackTrace(); } }

    • ベストアンサー
    • Java
  • 【Excel VBA】選択フォルダへの相対パス

    色々なサイトを参考に、Excel VBAにて以下の様なロジックを作りました。 -------------- Dim SHELL, MYPATH Dim TARGETDIR As String Set SHELL = CreateObject("Shell.Application") Set MYPATH = SHELL.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, ThisWorkbook.Path) If MYPATH Is Nothing Then End TARGETDIR = MYPATH.items.Item.Path Set SHELL = Nothing Set MYPATH = Nothing -------------- ブックのあるパス配下のフォルダを選択して、フルパスを"TARGETDIR"に格納します。 質問は2つです。 (1)"~.items.Item.Path"の構文の意味を教えて下さい。 (2)フルパスではなく"ブックのあるパスから見た、選択したフォルダへの相対パス"を知る方法を教えて下さい。 よろしくお願いします。

  • トップディレクトリから相対パスで記入ってどういう意味なのでしょうか?

    ------------------------------------------------------------------------------ 現在の階層です↓ Macintosh HD/作業/HP/○○○/△△△/php/emoji/images ------------------------------------------------------------------------------ imagesフォルダをのパスをトップディレクトリから相対パスで記入。 とあるのですが、正解がよく分かりません。 /Macintosh HD/作業/HP/○○○/△△△/php/emoji/images ↑コレは絶対パスですよね? 相対パスの記述を教えていただけますか?

    • ベストアンサー
    • HTML
  • 絶対パス ⇒ フォルダかファイルかの判別

    お世話様です。 C#.NET(1.1)でプログラミングしてます。 標記の通り、絶対パス(string)を与えられたときに、フォルダなのかファイルかなのかを判別したいのですが、いいメソッドが見当たりません。 (PathクラスやFileInfoクラスとか調べたんですが…) 言語の質問ではないですが、 知恵をお貸しください。よろしくお願いいたします。(x_x)

  • 指定フォルダの絶対パス取得

    初歩的なことですが教えてください。 VB.netにて、指定したフォルダの相対パスに対する絶対パスの取得を行いたいのですが、良い方法が見つかりません。 「Path.GetFullPath メソッド」を使用して見ましたが、存在しないパス「例:\A\」を指定すると、勝手に「例:C:\A\」のように絶対パスが割り付けられてしまいます。実際に存在するパスを検索して取得することは出来ないのでしょうか? 例:「ABC」というフォルダが「C:\program files」や「D:\」などに存在するという結果です。

  • windows7 相対パスによるシンボリックリンク

    windows 7上で、外付けHDDに相対パスによるシンボリックリンクを張りたいのですが、できません。 D:\Data0 D:\Src という二つのフォルダがあったとします。Srcフォルダ内に、Data1というシンボリックリンクを作り、一つ上のData0に張りたいのですが、うまくできません。 % mklink /d "Data1" "../Data0" をしたところ、リンクは生成されるのですが、リンクフォルダをダブルクリックすると 「D:\Src\Data1にアクセスできません。ファイル名、ディレクトリ名、またはボリュームラベルの構文が間違っています」 というエラーメッセージが出て、アクセスできません。

専門家に質問してみよう