- 締切済み
ユーザディレクトリのパス指定
C++でユーザディレクトリ下のファイルを操作したいと思い http://hkpr.info/vc/UserDirectory/ のページを参考にプログラムに適用しました。 その結果、該当フォルダのパスがString型の変数に入ることは確認しました。 しかし、そのフォルダからさらに、下のフォルダ内のファイルを指定しようと そのString型の変数の後ろに「+=」を用いて、さらにパスを連結をしようとしたのですが、 うまく連結できませんでした。 例) 上記リンク先のサンプルで得たパス+=追加のパス; →連結されず、サンプルで得たパスのまま 追加のパス+=上記リンク先のサンプルで得たパス; →連結される。しかし、パスの順序が逆なのでパスとしては意味をなさない 上記リンク先のサンプルを利用しつつ、追加パスの連結を実現するにはどうすればいいのでしょうか? もしくは、ユーザディレクトリの取得としてもっといい方法があるのでしょうか? 補足ですが 「アプリケーションデータのディレクトリ」を利用したいと考えています
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Wr5
- ベストアンサー率53% (2173/4061)
回答No.1
>しかし、そのフォルダからさらに、下のフォルダ内のファイルを指定しようと >そのString型の変数の後ろに「+=」を用いて、さらにパスを連結をしようとしたのですが、 >うまく連結できませんでした。 どういうコード書いたんです? 戻り値がconstになっているわけではないようなので、普通に連結できるとは思いますが……。 # 掲示されたリンク先の通りなら…ですが。 # まぁ、その場合はString型ではありませんが。
お礼
すみません、自己解決しました。 恐らく「str.assign("\0", USERDIRECTORY_MAX_PATH + 1);」で、 最大範囲を取っているのが原因かと思われます。 追加しても、strの中身は「アプリケーションデータのパス\0.....\0追加したパス」となって、 最初の\0までしか有効になってない。 なので、サンプルを改変するなりしないと追加は無理なようでした。
補足
コードは以下のようなものを書きました。 #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文内のループに特に意味はありません。 よろしくお願いします