プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっています。
VS2005でWindowsアプリケーション作成を行っています。

今回、フルパス名を仮に
 szPath = "c:\Test\Debug\test.exe"

とした場合、最後の"test.exe"を取り出すためには、
 _splitpath(szPath, drive, dir, name, ext);
 _makepath(path, drive, dir, NULL, NULL);

としますが、"Debug\test.exe"を取りたい場合も、
上記の関数を使ってできるのでしょうか?

ご教授お願いいたします。

A 回答 (4件)

shlwapi.hの関数を使うとこんな感じ。



TCHAR szFilePath[MAX_PATH];
TCHAR szFileName[_MAX_FNAME + _MAX_EXT];
TCHAR szParentDirPath[_MAX_DIR];
TCHAR szParentDirName[_MAX_FNAME];
TCHAR szTargetPath[_MAX_PATH];

// 自分自身のフルパス(サンプル用)
::GetModuleFileName(NULL, szFilePath, _countof(szFilePath));
// ファイル名を取得
lstrcpy(szFileName, ::PathFindFileName(szFilePath));

// ファイル名を除いたパスを取得
lstrcpy(szParentDirPath, szFilePath);
::PathRemoveFileSpec(szParentDirPath);

// ルート以外なら親ディレクトリがある
if (!::PathIsRoot(szParentDirPath))
{
  // 親ディレクトリ名を取得
  lstrcpy(szParentDirName, ::PathFindFileName(szParentDirPath));
  // ファイル名と結合
  ::PathCombine(szTargetPath, szParentDirName, szFileName);
}
// ルートの場合は親ディレクトリがないが・・・?
else
{
  // 一応ファイル名だけ
  lstrcpy(szTargetPath, szFileName);
}
    • good
    • 0

「パスを除いてファイル名だけにする」は出来ますね?



では「ファイル名を除いてパスだけにする」は出来ますか?

そして「ファイル名を除いてパスだけにした物の、末尾の¥を取り除く」のは出来ますか?

それが出来れば
c:\Test\Debug\test.exe
から
c:\Test\Debug\
を作り、それから
c:\Test\Debug
を作るのは可能ですね?

では
c:\Test\Debug
から
Debug
を取り出すのは?

これは
c:\Test\Debug\test.exe
から
test.exe
を取り出すのと同じです。

「Debug」を取り出せて「test.exe」も取り出せるなら、あとは
Debug + "\\" + test.exe
を行えば
Debug\test.exe
が出来ます。
    • good
    • 0
この回答へのお礼

大変遅くなり申し訳ありません。
皆様、ご回答ありがとうございました。

皆様のおかげで、"Debug\test.exe"を取り出すことができましたので
まとめてchie65535さんのお礼欄にお礼を申し上げます。
chie65535さんごめんなさい。

これからもC++がんばっていきます。
chie65535さんをはじめbluecampusさんとreset_catさん、
本当にありがとうございました。

お礼日時:2009/12/24 03:02

訂正



>TCHAR szParentDirPath[_MAX_DIR];
TCHAR szParentDirPath[MAX_PATH];
    • good
    • 0

あまりきれいなやり方ではないですが、必ず1つ上の階層を指定したいのであれば、以下のような方法が使えるかもしれません。



 _splitpath(szPath, drive, dir, name, ext);
strcat(dir, "..\\");
 _makepath(path, drive, dir, NULL, NULL);
    • good
    • 0

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