フルパスからフォルダを階層分割するには? – プログラミング – Home

フルパスからフォルダを階層分割するには...
 
通知
すべてクリア

[解決済] フルパスからフォルダを階層分割するには?


POTETO
 POTETO
(@POTETO)
ゲスト
結合: 16年前
投稿: 12
Topic starter  

実行モジュールのフルパスから1つ上のパスを取得したいと
思っていますが、考えている方法が正しいのか?
また、他に良い方法があるのか教えてください。

考えていた方法は
「GetModuleFileName」で、実行モジュールのフルパスを取得し
「_tsplitpath」で、フルパスを分割したドライブ名とディレクトリ名を連結後
最後の\を取り除いたものをフルパスとして再度「_tsplitpath」を実行することで
分割したドライブ名とディレクトリ名を取得して実行モジュールの
1つ上のパスが得られると思いますが、この方法で1つ気になるのが
「_tsplitpath」に与えるフルパスがファイル名ではなくフォルダ名を指して
いても問題はないかです。
実際にフォルダ名を指すフルパスでも動作しますが、動作するからOKと
確信が持てなかったため。

※この時、前提としてフルパスの1つ上はドライブではなくフォルダとして
存在していること。

開発環境
VC++2005
Windows XP


引用未解決
トピックタグ
芋
 芋
(@芋)
ゲスト
結合: 16年前
投稿: 6
 

自分が知る範囲では、問題ない。


返信引用
徹也
 徹也
(@徹也)
ゲスト
結合: 16年前
投稿: 5
 

PathRemoveFileSpec
を調べると幸せになれるかもしれない


返信引用
POTETO
 POTETO
(@POTETO)
ゲスト
結合: 16年前
投稿: 12
Topic starter  

芋さん
レスありがとうございます。
フルパスにフォルダを指定しているサンプルを見たことなくて不安でした。

徹也さん
レスありがとうございます。
PathRemoveFileSpecを見ましたがこれも_tsplitpathと似たような機能で
ファイル名とファイル名までを分割してくれる関数ですよね?
実行モジュールのあるフォルダではなく、その1つ上のパスを
取得するための方法で悩んでいたため、PathRemoveFileSpecを使って
その問題をどう解決できるのかが分かりませんでした。
出来ればもう少しヒントをいただけませんか?

念のため今欲しいパスは以下のようなフォルダ構成で、exeフォルダ内に
ある実行モジュールでconfのフォルダまでのフルパスを取得したいと思っています。

D:
└AAA
 ├exe
 └conf

※Dドライブ、AAA、exeのフォルダ名は決まっておらず、confのフォルダ名のみ
 固定で実行モジュールで知ることが出来る状況で考えています。


返信引用
徹也
 徹也
(@徹也)
ゲスト
結合: 16年前
投稿: 5
 

TCHAR Path[_MAX_FNAME];
TCHAR Path2[_MAX_FNAME];
GetModuleFileName(NULL, Path, sizeof(Path));
PathRemoveFileSpec(Path);
PathCombine(Path2, Path, _T(..\\Conf));

って事ですか?


返信引用
POTETO
 POTETO
(@POTETO)
ゲスト
結合: 16年前
投稿: 12
Topic starter  

徹也さん
それだと上記に示したexeフォルダにある実行モジュールの場合
GetModuleFileNameでD:\AAA\exe\xxx.exeが取得できて、
PathRemoveFileSpecでD:\AAA\exeが取得できて
PathCombineでD:\AAA\exe\Confになりませんか?

欲しいパスはD:\AAA\Confなので求めるパスが得られないと思います。


返信引用
徹也
 徹也
(@徹也)
ゲスト
結合: 16年前
投稿: 5
 

>PathCombineでD:\AAA\exe\Confになりませんか?
なりません

>欲しいパスはD:\AAA\Confなので求めるパスが得られないと思います。
得られていると思いますが?
そちらの環境では得られないのですか?


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

ポイントは、\\Confの前に..がついている点です。
この辺はパスに関する記述について調べてみると良いです。

要は、「D:\AAA\..\Conf」てな記述も許されるって話です。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

失礼。

「D:\AAA\exe\..\Conf」が正解でした。


返信引用
杏の里
 杏の里
(@杏の里)
ゲスト
結合: 17年前
投稿: 7
 

#include <windows.h>
#include <shlwapi.h>
#pragma comment(lib, shlwapi.lib)

void main()
{
TCHAR Path[_MAX_FNAME];
TCHAR Path2[_MAX_FNAME];

GetModuleFileName(NULL, Path, sizeof(Path));
PathRemoveFileSpec(Path);
PathCombine(Path2, Path, (..\\Conf));
printf(%s\n, Path2 );
}

D:\AAA\Conf と表示されました。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

ふむ。
PathCombineで読み替えまでやってくれるんですねぇ。
便利な関数があるなぁ。


返信引用
POTETO
 POTETO
(@POTETO)
ゲスト
結合: 16年前
投稿: 12
Topic starter  

レスいただいた方々へ

返事が遅くなってすみません。
最初に質問したときVC++を使って作業できる環境がなくて
実際に試すことも出来ずに、ただネットで調べてみて出来そうにないと
勝手な解釈で判断していました。

実際には杏の里さんの書いてくれているような方法で
実現できました。

PathCombineについては、前から知っていたのに
使う前から結合するだけなら文字列コピーと変わらないんじゃと
甘くみていました。
こんな便利なものとは。。。

遅くなりましたが、教えていただいてありがとうございました。

やりたかったことが出来たので解決とさせていただきます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました