
C++でユーザディレクトリ下のファイルを操作したいと思い
http://hkpr.info/vc/UserDirectory/
のページを参考にプログラムに適用しました。
その結果、該当フォルダのパスがString型の変数に入ることは確認しました。
しかし、そのフォルダからさらに、下のフォルダ内のファイルを指定しようと
そのString型の変数の後ろに「+=」を用いて、さらにパスを連結をしようとしたのですが、
うまく連結できませんでした。
例)
上記リンク先のサンプルで得たパス+=追加のパス;
→連結されず、サンプルで得たパスのまま
追加のパス+=上記リンク先のサンプルで得たパス;
→連結される。しかし、パスの順序が逆なのでパスとしては意味をなさない
上記リンク先のサンプルを利用しつつ、追加パスの連結を実現するにはどうすればいいのでしょうか?
もしくは、ユーザディレクトリの取得としてもっといい方法があるのでしょうか?
補足ですが
「アプリケーションデータのディレクトリ」を利用したいと考えています
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.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文内のループに特に意味はありません。
よろしくお願いします
すみません、自己解決しました。
恐らく「str.assign("\0", USERDIRECTORY_MAX_PATH + 1);」で、
最大範囲を取っているのが原因かと思われます。
追加しても、strの中身は「アプリケーションデータのパス\0.....\0追加したパス」となって、
最初の\0までしか有効になってない。
なので、サンプルを改変するなりしないと追加は無理なようでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 コマンドプロンプトの使い方 1 2022/10/13 14:43
- その他(プログラミング・Web制作) 図に示す階層構造で,現在のディレクトリ(カレントディレクトリという)が*印のディレクトリであるとき, 2 2022/11/16 10:55
- Android VBA、フォルダのパスに環境文字 ㉑ があり、VBAが機能しません。 2 2022/07/27 09:16
- Excel(エクセル) 【マクロ】フォルダAからダBへファイルを、ファイルの更新日時の条件で、1つづつ移動するには? 3 2022/08/25 09:56
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- Excel(エクセル) 【VBA】フォルダAにある2つのファイルの内1つを、フォルダBへ。もう1つを、フォルダBへ移動したい 6 2022/07/26 08:51
- Visual Basic(VBA) VBAでファイル名を指定して保存するとき 4 2023/03/26 21:55
- HTML・CSS Dreamweaver のテンプレートでの相対パスの設定について 2 2023/06/13 17:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルvbaでdocuworksprinter...
-
VBAでの共有パスにつきまして
-
SDIアプリ D&Dで複数のファイ...
-
xcopyコマンドの進行状況を表示...
-
VBAで、VBのapp.pathと同じ機能...
-
C# MP4のタグ情報のサブタイト...
-
Dosバッチでファイルパスからフ...
-
Excel 相対パス
-
エクセルマクロ 指定したフォ...
-
VBAでテキストファイル中の文字...
-
ユーザディレクトリのパス指定
-
【Excel VBA】Power Qurry でCS...
-
実行ファイルのパスを取得したい
-
VBAとロングファイル名
-
アクセス 自身のデータベース...
-
エクセルマクロでファイル名の...
-
C++でのフォルダ削除ができま...
-
サブフォルダから部分一致のエ...
-
エクセルのプロパティーでセキ...
-
PDFファイルについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルvbaでdocuworksprinter...
-
エクセルVBAで一つ上の階層...
-
xcopyコマンドの進行状況を表示...
-
Excel 相対パス
-
実行ファイルのパスを取得したい
-
コマンドプロンプトのコピー関...
-
【VB.NET】App.configにファイ...
-
エクセルのマクロで特定フォル...
-
VBA★PDFをPDFアプリで印刷し...
-
ExcelVBAの使い方 ¥の使い方...
-
fopenでのパス指定
-
ExcelのVBAで上書き保存を確...
-
EXCEL(VBA)で指定フォルダ内の...
-
C#でのProcess.Startと変数path
-
【VBA】ExcelマクロでCSVファイ...
-
VBAでパワーシェルを実行したい...
-
A列に記載されているフォルダ...
-
初心者powershellのPS1ファイル...
-
Eclipse
-
VBAとロングファイル名
おすすめ情報