• 締切済み

ユーザディレクトリのパス指定

C++でユーザディレクトリ下のファイルを操作したいと思い http://hkpr.info/vc/UserDirectory/ のページを参考にプログラムに適用しました。 その結果、該当フォルダのパスがString型の変数に入ることは確認しました。 しかし、そのフォルダからさらに、下のフォルダ内のファイルを指定しようと そのString型の変数の後ろに「+=」を用いて、さらにパスを連結をしようとしたのですが、 うまく連結できませんでした。 例) 上記リンク先のサンプルで得たパス+=追加のパス; →連結されず、サンプルで得たパスのまま 追加のパス+=上記リンク先のサンプルで得たパス; →連結される。しかし、パスの順序が逆なのでパスとしては意味をなさない 上記リンク先のサンプルを利用しつつ、追加パスの連結を実現するにはどうすればいいのでしょうか? もしくは、ユーザディレクトリの取得としてもっといい方法があるのでしょうか? 補足ですが 「アプリケーションデータのディレクトリ」を利用したいと考えています

みんなの回答

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

>しかし、そのフォルダからさらに、下のフォルダ内のファイルを指定しようと >そのString型の変数の後ろに「+=」を用いて、さらにパスを連結をしようとしたのですが、 >うまく連結できませんでした。 どういうコード書いたんです? 戻り値がconstになっているわけではないようなので、普通に連結できるとは思いますが……。 # 掲示されたリンク先の通りなら…ですが。 # まぁ、その場合はString型ではありませんが。

nemu19
質問者

お礼

すみません、自己解決しました。 恐らく「str.assign("\0", USERDIRECTORY_MAX_PATH + 1);」で、 最大範囲を取っているのが原因かと思われます。 追加しても、strの中身は「アプリケーションデータのパス\0.....\0追加したパス」となって、 最初の\0までしか有効になってない。 なので、サンプルを改変するなりしないと追加は無理なようでした。

nemu19
質問者

補足

コードは以下のようなものを書きました。 #include <stdlib.h> #include <stdio.h> #include <windows.h> #include <userenv.h> #include <shlobj.h> #include <string> #include <iostream> #pragma comment(lib, "userenv.lib") #define USERDIRECTORY_MAX_PATH (4096) std::string getShellDirectory(int nFolder) { HRESULT result; LPITEMIDLIST pidl; std::string str; IMalloc *pMalloc; SHGetMalloc(&pMalloc); result = ::SHGetSpecialFolderLocation(NULL, nFolder, &pidl); if (FAILED(result)) { pMalloc->Release(); str.assign("\0", 1); return str; } str.assign("\0", USERDIRECTORY_MAX_PATH + 1); ::SHGetPathFromIDList(pidl, (LPSTR)str.c_str()); pMalloc->Free(pidl); pMalloc->Release(); return str; } std::string readFilePath(){ std::string path=getShellDirectory(CSIDL_APPDATA); path+="\aaa\bbb.ini"; return path; } int main(void){ std::string strPath=readFilePath(); while(1){} return 0; } パスが追加されるかを見たいだけだったので、 追加されるパス名や、main文内のループに特に意味はありません。 よろしくお願いします

関連するQ&A

  • 全ユーザのパスの指定

    RedHat7.1を使用しています。 質問なのですが あるパッケージをインストールして それが/usr/local/hogeというディレクトリに hogeという実行ファイル(つまり/usr/local/hoge/hoge)と pluginなどのファイル(hoge実行時に読み込まれる)ができるときに ユーザにそのhogeを実行させるにはどうすればいいでしょうか? 1.ユーザに/usr/local/hoge/hogeと打たせる これは少し避けたいです。 2./usr/bin以下にシンボリックリンクを作る 普通はこの方法をすぐ思いつきますが 実行時、他の必要なファイル(plugin)を /usr/binの中で探してしまい、エラーがでます。 3.全ユーザのパスを/usr/local/hogeに張る 結局、こうすることにしたのですが 全ユーザのパスを一度に変更する事は可能なのでしょうか? また、どうすればよいのでしょうか? あと、みなさんはこの場合、どんな方法をとっていますか?

  • パスから最後のディレクトリだけを取得したいです

    【環境】WindowsXP、VC++2005(MFC) タイトルの通りなんですが、例えば 「D:\10_test\hoge\sample」というディレクトリのパスから 「sample」だけを取得したいのですが、どうすれば出来ますでしょうか? ご教授お願いいたしますm(__)m

  • ファイルを指定して開きたいのですが…

    フォルダにいくつかのexcelシートがあります。 それをフォームを使ってそれぞれ呼び出すようにしたいのですが、 カレントディレクトリにあるはずなのに、3回に1回は「ファイルが見つかりません」となり、開けないことがあります。 そこで、先にカレントディレクトリを取得して、その取得した値をもとにフルパス指定するなどして、ファイルを開くようにしたいのですが、できそうでできません。 ちなみに、C:~などとあらかじめ設定してしまうと、コレを利用する複数のユーザがいるのですが、それぞれパスが異なっているために、個人用にパスを書き直さなければならなくなってしまうので、上記の方法を思いつきました。 最悪ネットワーク上に必要なデータ(フォルダ)を置き、そこを開くようにすれば?とも思ったのですが動作が重くなってしまうので、なるべくならやりたくありません。 どなたかお力を拝借できませんでしょうか。

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

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

  • VS2010追加のインクルードディレクトリについて

    ソリューションと同階層にソースファイルやヘッダーファイルを散乱させるのは汚いなと思い、フォルダに分けました。 例) .slnの階層     mainフォルダ        main.h        main.cpp     sampleフォルダ        sample.h        sample.cpp      abcdフォルダ        abcd.h        abcd.cpp      efghフォルダ        efgh.h        efgh.cpp するとヘッダーをインクルードする時にパスが増えてしまうのも嫌だなと思って、 プロパティ   C/C++     全般       追加のインクルードディレクトリー で作ったフォルダを全て指定しました。 そうしたら一応 main.cpp で #include "sample.h" だけで通るのですが いつも #include "s まで打つとsample.hが候補で出てきてたのですが出なくなってしまいました。 代わりに当然といえば当然ですが #include "sample/sample.h" は候補に出てきます。 追加のインクルードディレクトリーをしても 候補は直接出てくるようには出来ないのでしょうか? パスを全部書いてしまうと追加した意味がありません… これと同様の質問なのですが、 abcd.cpp で main.h をインクルードしたい時も 候補には出ず、../を打って出てくると思うのですが こちらも追加のインクルードディレクトリをしても直接出るようには出来ないのでしょうか? なにか変なことを言ってるような気がしてきましたが よろしければ教えて下さい。

  • フルパスからファイル名取得の方法

    指定したフォルダのフルパスを「bmpFiles」に入れているのですが、表示する時はファイル名のみの表示にしたくて「Path.GetFileName」を使用してファイル名を取得しようとしたのですが、「型'stringの1次元配列'の値を'string'に変換できません」というエラーが出てしまいます。 VBを始めたばかりでよく分からないのでアドバイスをお願いします。 Dim imageDir As String = fbd.SelectedPath ' 指定フォルダまでのディレクトリ Dim bmpFiles As String() = _ System.IO.Directory.GetFiles(imageDir, "*.bmp") 'フルパス Dim bmpFileName As String = _ Path.GetFileName(bmpFiles)  ←bmpFilesで上記エラー

  • パスがあってない?指定されたパスが見つかりません

    【OS】Win7 32bit bat((1)とする)で、 devcon.exe update "C:\Program Files\Microsoft Xbox 360 Accessories\Xusb21.inf" "USB\VID_045E&PID_028E" del C:\Users\Yxxxxxxxxx\Desktop\フォルダ1\フォルダ2\x360c.win7.x86.ja\x360cps.dll pause というコマンドを実行するときに、 一行目のdevcon.exeのupdateはDrivers updated successfullyと出るので、実行されていると思います。 しかし、二行目のdelのコマンドは、 「C:\windows\system32>del C:\Users\Yxxxxxxxxx\Desktop\フォルダ1\フォルダ2\x360c.win7.x86.ja\x360cps.dll 指定されたパスが見つかりません」と出ます。 パスが見つからないのだから、環境変数のpathに C:\Users\Yxxxxxxxxx\Desktop\フォルダ1\フォルダ2\x360c.win7.x86.ja を追加すればうまくいくだろうと追加したのですが、やはり同じ結果に。 違うbat((2)とする)もありまして、 devcon.exe update "C:\Users\Yxxxxxxxxx\Desktop\フォルダ1\フォルダ2\x360c.win7.x86.ja\x360c.inf" "USB\VID_045E&PID_028E" pause というbatなのですが、こちらはdevconのupdateだけですがupdated succsessfullyと出るので、 C:\Users\Yxxxxxxxxx\Desktop\フォルダ1\フォルダ2\x360c.win7.x86.ja は通ってることになると思うんです。 x360cps.dllという文字列を「プログラムとファイルの検索」から検索して、場所を確認するとC:\Users\Yxxxxxxxxx\Desktop\フォルダ1\フォルダ2\x360c.win7.x86.ja となっているし、このフォルダ内のx360cps.dllをcmd画面にドラッグ&ドロップすると、 C:\Users\Yxxxxxxxxx\Desktop\フォルダ1\フォルダ2\x360c.win7.x86.ja\x360cps.dll と出ます。 削除自体はデスクトップからできるのですが、 なぜこの場合「指定されたパスが見つかりません」と出るのか納得がいきません。 フォルダ1,2のフォルダ名がいけないのでしょうか? でも(2)が実行されてるしなあ。updateとdelではフォルダ名によってできるできないがわかれるのでしょうか? フォルダ1の名前は全角カタカナ、フォルダ2の名前は漢字、半角スペース、全角カタカナの混在です。 この場合なぜ「指定されたパスが見つかりません」と出るのかどなたか教えていただけませんか? 足りない情報としてどんなものがあるかわからないので、足りない情報があればおっしゃってください。 ちなみに、batやpathについてはネットで読みかじった程度の知識しか持っておりません。 こんな者への回答ですが、宜しくお願いします。

  • 相対パスの指定

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

  • VC++ の ユーザインタフェースについて

    VC++ 6.0の初心者です。 VC++で、エクスプローラのようなユーザインタフェースを作成しようかと思っております。 【仕様】 ・ツリービューにてフォルダとその中にあるファイルを 一覧で表示する ・UIからファイルをマウスでクリック(選択)する事で クリックされたファイルパスをVC++上の変数へ格納する 入門書等を読んでみたのですが、私のスキルでは作成不能との見解になりました。 上記仕様を持つプログラムのざっくりとした作成方法、 もしくは上記と類似のサンプルプログラム等がどこかにございましたら教えて頂けませんでしょうか。 宜しくお願い致します。

  • ユーザにディレクトリを選択させる方法

    ダイアログをだしてユーザにディレクトリを選択させ その指定したディレクトリにファイルを作成する処理 を行いたいのですがわかりません。 ※ユーザがダイアログから選んだディレクトリ名がStringで取得できる までを教えてください。ファイル作成方法は調査済みです。 どういうプログラミングでをすればいいでしょうか ダイアログの設定方法(プロパティ等)やプログラミング コードをできれば詳細に教えてください プログラマ1年目の新米でわからない事だらけで 調査が思う様に進んでいません。宜しくお願いいたします ちなみにVB2005を利用しています。

専門家に質問してみよう