絶対パスを相対パスに変換する方法について

このQ&Aのポイント
  • VC++2005 Express Editionを使用して、ドラッグアンドドロップで受け取った絶対パスファイル名を相対パスに変換する方法を教えてください。
  • Unicodeとマルチバイトの両方に対応したコードサンプルもあれば、教えていただけると助かります。
  • GetCurrentDirectoryを使用してカレントディレクトリを取得しましたが、ドライブ名の大文字小文字の違いから簡単には相対パスに変換できませんでした。どのようにすればいいでしょうか?
回答を見る
  • ベストアンサー

絶対パスを相対パスに

VC++2005 Express Editionです。 ドラッグアンドドロップで受け取った(DragQueryFile)絶対パスファイル名を相対パスに変換したいのですが、良いコードサンプルなどありましたら教えてください。できればUnicodeとマルチバイトの両方に対応させたいです。 GetCurrentDirectoryでカレントディレクトリを取得してみたのですが、この場合ドライブ名が大文字なのに対し、ドラッグアンドドロップで受け取ったドライブは小文字なので、簡単にはできそうにありませんでした。 文字列処理は今まで標準関数しか使ったことがありませんが、これを機会にコードなど勉強したいと思っています。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

#include <shlwapi.h> すると、 PathRelativePathToというズバリのapiが使えます。 コンソールアプリとかだと、shlwapi.libをリンクする必要があると思います。 http://nienie.com/~masapico/api_PathRelativePathTo.html

masaota56
質問者

お礼

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

関連するQ&A

  • 相対パスの指定

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

  • c:\をドラッグ&ドロップしたい

    DragAcceptFiles,DragQueryFile,DragFinish及びWM_DROPFILES でディレクトリをドラッグ&ドロップしてディレクトリ名を受け取るプログラムを作ったのですが c:\,a:\等のドラッグ&ドロップが拒否されます。 どうしたらc:\などをドラッグ&ドロップしたときそのディレクトリ名を受け取れるようにできるでしょうか?

  • 相対パスを絶対パスに変換したい

    こんにちは。 いつもお世話になっております。 ファイルユーティリティ関連のOCXを作成しておりまして、行き詰まってしまいました。 どうかご教示下さい。 内容はタイトルの通り、相対パスを絶対パスに変換したいというものです。 OCXの作りとして、VBから絶対パス、相対パスが区別なく渡されるものとしてどちらでも絶対パスとして内部的に扱いたく思います。 例えばD:\test\bin、D:\test\workというフォルダが存在するとして、 D:\test\bin\sample.exe内で ".\..\work"が渡された場合に OCX内部で"D:\test\work"に変換するというものです。 以下のようなコードも試してみたのですが、どうもうまく動きません。 if(_fullpath(ApsPath, RelPath, 0x100) == NULL){ //変換失敗の場合 ApsPath = RelPath; } どうかよろしくお願いします。 環境:Windows 2000 VC6.0

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

  • setcurrentdirectoryのパス拡張の問題

    すみませんが、setcurrentdirectory関数は、指定されるパスをプロセスの カレントディレクトリとするのが知られていますが、例えば、 setcurrentdirectory(_T"C:")だと、Cのディレクトリをカレントディレクトリとしたが、Unicodeでパスの拡張のため、引数を\\\\?\\C:を指定して あれれば、拡張すると仕様になっているはずが、 なぜ、\\\\?\\C:を指定したら、引数が間違いますというエラーがあったが、 \\\\?\\C:\\を指定したら、通りました。 よろしくお願いします。

  • CSSが反映されない(相対パスを使う?)

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

    • ベストアンサー
    • HTML
  • Gnuplot 上でカレントディレクトリ変更 @ windows

    表題の通り、Gnuplot (win版) 上でカレントディレクトリを変更するコマンド等はありませんでしょうか。 具体的には  load \'(絶対パス)\\a.plt\' としたときに、カレントディレクトリを (絶対パス) のディレクトリに変更したいと思っています。 ただし load は手入力ではなく、Gnuplot 上へ a.plt をドラッグアンドドロップすることで load する、 という手順を大前提として、上記のことを実現したい次第です。 a.plt の中でカレントディレクトリを変更できるコマンド等はありませんでしょうか。

  • Pictureboxにドラッグドロップで入れた画像のパスはどこに?

    VB6です。 ピクチャーボックスにドラッグアンドドロップでほりこんだ画像のパスを取得したいのですが、どのプロパティが持っているのかいまいちわかりません。 どのプロパティが保持しているのか、もしくは個別に取得するコードを書かなければいけないのでしょうか。

  • 相対パスについて

     いつもお世話になっております。  お聞きしたいのは、画像やリンクのファイルを指定する方法についてです。違うディレクトリへのリンクの場合、たとえば<A href="a/b.html">のように指定すればいいですよね。しかし、上位ディレクトリへリンクしたい場合、どのようにすればよいでしょうか?絶対パスで<A href="http://www~">と指定するしかないのでしょうか?  サイトのほうはそれで誤魔化してきましたが、今、自分なりに紙データをデジタルデータ化しています。たとえば料理のレシピだと「料理」フォルダの中に「豚肉」「お菓子」などのように分けるという具合です。その「お菓子」フォルダ(実際には別の英語名ですが)にあるファイルから、一番上にあるHOMEまでリンクさせるのにはどうしたらよいでしょうか?  このファイルは、いずれCDに移すつもりでいます。が、CD-ROMドライブは人によってD:ドライブではないこともありますよね。それもふまえて、どうすればよいでしょうか?

    • ベストアンサー
    • HTML
  • エクセルVBAで相対パスでファイルを読み込めない

    こんにちは。 標題の通りです。 現在、エクセルのVBAを使用してちょっとしたものを作成しているのですが、 相対パスを使用して他のファイル(DATファイル)を読みこませようとしています。 しかし、どうにもうまくいかなかったのです。 最初は問題なく読み込めていましたが、あるとき突然パスが見つかりませんとの エラーメッセージが出るようになりました。 結局、開いているブックの絶対パスを取得するという方法にして思っている結果 は得られることができましたが、どうにも不思議なので質問しました。 コードは以下のように記述していました。 Open "..\ディレクトリ\ファイル.dat" For Input As #1 上記ではだめなのでしょうか? VBでは問題なかったような気がします。

専門家に質問してみよう