フルパスからフォルダを階層分割するには?

[戻る]
POTETO 2008/10/04(土) 21:46:12
実行モジュールのフルパスから1つ上のパスを取得したいと
思っていますが、考えている方法が正しいのか?
また、他に良い方法があるのか教えてください。

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

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

開発環境
VC++2005
Windows XP

2008/10/04(土) 23:31:25
自分が知る範囲では、問題ない。

徹也 2008/10/05(日) 15:47:10
PathRemoveFileSpec
を調べると幸せになれるかもしれない

POTETO 2008/10/05(日) 16:16:09
芋さん
レスありがとうございます。
フルパスにフォルダを指定しているサンプルを見たことなくて不安でした。

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


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

D:
└AAA
 ├exe
 └conf

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

徹也 2008/10/05(日) 17:35:21
TCHAR Path[_MAX_FNAME];
TCHAR Path2[_MAX_FNAME];
GetModuleFileName(NULL, Path, sizeof(Path));
PathRemoveFileSpec(Path);
PathCombine(Path2, Path, _T("..\\Conf"));

って事ですか?

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

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

徹也 2008/10/05(日) 21:41:16
>PathCombineでD:\AAA\exe\Confになりませんか?
なりません

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

PATIO 2008/10/06(月) 10:26:38
ポイントは、\\Confの前に..がついている点です。
この辺はパスに関する記述について調べてみると良いです。

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

PATIO 2008/10/06(月) 10:27:22
失礼。

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

杏の里 2008/10/06(月) 12:03:09
#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 2008/10/06(月) 13:03:59
ふむ。
PathCombineで読み替えまでやってくれるんですねぇ。
便利な関数があるなぁ。

POTETO 2008/10/07(火) 22:54:29
[[解決]]
レスいただいた方々へ

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

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

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

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

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

古いスレッドには追加発言できません。