重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

C++でユーザディレクトリ下のファイルを操作したいと思い
http://hkpr.info/vc/UserDirectory/
のページを参考にプログラムに適用しました。

その結果、該当フォルダのパスがString型の変数に入ることは確認しました。
しかし、そのフォルダからさらに、下のフォルダ内のファイルを指定しようと
そのString型の変数の後ろに「+=」を用いて、さらにパスを連結をしようとしたのですが、
うまく連結できませんでした。

例)
上記リンク先のサンプルで得たパス+=追加のパス;
→連結されず、サンプルで得たパスのまま

追加のパス+=上記リンク先のサンプルで得たパス;
→連結される。しかし、パスの順序が逆なのでパスとしては意味をなさない


上記リンク先のサンプルを利用しつつ、追加パスの連結を実現するにはどうすればいいのでしょうか?
もしくは、ユーザディレクトリの取得としてもっといい方法があるのでしょうか?

補足ですが
「アプリケーションデータのディレクトリ」を利用したいと考えています

A 回答 (1件)

>しかし、そのフォルダからさらに、下のフォルダ内のファイルを指定しようと


>そのString型の変数の後ろに「+=」を用いて、さらにパスを連結をしようとしたのですが、
>うまく連結できませんでした。

どういうコード書いたんです?
戻り値がconstになっているわけではないようなので、普通に連結できるとは思いますが……。
# 掲示されたリンク先の通りなら…ですが。
# まぁ、その場合はString型ではありませんが。

この回答への補足

コードは以下のようなものを書きました。

#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文内のループに特に意味はありません。

よろしくお願いします

補足日時:2013/06/24 08:42
    • good
    • 0
この回答へのお礼

すみません、自己解決しました。

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

お礼日時:2013/06/24 12:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!