• ベストアンサー

フルパス名の取り出し

いつもお世話になっています。 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"を取りたい場合も、 上記の関数を使ってできるのでしょうか? ご教授お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

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); }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • chie65535
  • ベストアンサー率43% (8536/19406)
回答No.4

「パスを除いてファイル名だけにする」は出来ますね? では「ファイル名を除いてパスだけにする」は出来ますか? そして「ファイル名を除いてパスだけにした物の、末尾の¥を取り除く」のは出来ますか? それが出来れば 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 が出来ます。

mymusic54
質問者

お礼

大変遅くなり申し訳ありません。 皆様、ご回答ありがとうございました。 皆様のおかげで、"Debug\test.exe"を取り出すことができましたので まとめてchie65535さんのお礼欄にお礼を申し上げます。 chie65535さんごめんなさい。 これからもC++がんばっていきます。 chie65535さんをはじめbluecampusさんとreset_catさん、 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

訂正 >TCHAR szParentDirPath[_MAX_DIR]; TCHAR szParentDirPath[MAX_PATH];

全文を見る
すると、全ての回答が全文表示されます。
  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.1

あまりきれいなやり方ではないですが、必ず1つ上の階層を指定したいのであれば、以下のような方法が使えるかもしれません。  _splitpath(szPath, drive, dir, name, ext); strcat(dir, "..\\");  _makepath(path, drive, dir, NULL, NULL);

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • fopenでのパス指定

    毎度お世話になります。 ただ今VS2005でWindowsアプリケーションの実装を行っています。 fopenでパス指定をしてファイルを開くとき、  fopen("C:\\Test\\data.txt", w); としますが、GetModuleFileNameで取得したパス↓  GetModuleFileName(NULL, szPath, sizeof(szPath)); を使用したいとき、単に  fopen(szPath, w); ではできません。これはszPathの中身が  C:\Test\data.txt となっているためにfopenでは開けないんだと思うのですが、 わざわざszPathの文字を1文字づつ見ていって、 "\"があったときに"\"を付け足す… という作業をしなければならないのでしょうか。 他に解決策があるのでしょうか。 ご教授お願いします。

  • C#で相対パスを絶対パスへ変換したい

    C#で相対パスを絶対パスへ変換したい C#でプログラミングしています。 以下のようにベースとなる絶対パスと、そこからの相対パスがあるとします。 string basePath = "C:\\Projects\\Test001\\Debug\\"; string relativePath = "..\\..\\Test002\\"; 2つの文字列をただ足し合わせるだけだと、 "C:\\Projects\\Test001\\Debug\\..\\..\\Test002\\" となってしまいます。 これでも目的のパス「C:\\Projects\\Test002\\」にアクセスできますが、なにか既存の関数などを使って、「C:\\Projects\\Test002\\」というちゃんとした絶対パスを取得する方法はないでしょうか?

  • tar解凍でパス名を無しにする方法

    Windowsのtar.exeでも、Unix系のものでも良いのですが、 tarで解凍する際に、パス名を付けず、素のファイル名だけで 解凍する方法はありますか? 例えば、 > tar tvf test.tar -rw-rw-r-- 13 2006-03-09 14:19:39 ./file4 drwxrwxr-x 0 2006-03-09 14:16:20 dir1/ drwxrwxr-x 0 2006-03-09 14:19:12 dir1/dir12/ -rw-rw-r-- 15 2006-03-09 14:19:10 dir1/dir12/file1 drwxrwxr-x 0 2006-03-09 14:16:32 dir2/ drwxrwxr-x 0 2006-03-09 14:16:33 dir2/dir21/ drwxrwxr-x 0 2006-03-09 14:19:19 dir2/dir21/dir211/ -rw-rw-r-- 14 2006-03-09 14:19:17 dir2/dir21/dir211/file2 drwxrwxr-x 0 2006-03-09 14:19:32 dir2/dir21/dir212/ -rw-rw-r-- 25 2006-03-09 14:19:30 dir2/dir21/dir212/file3 となっているときに、このtest.tarを何らかの方法で解凍して、 1箇所のディレクトリ内(カレントで可)に、 file1~file4 を解凍させたいのですが、 何か方法があるでしょうか? よろしくお願いします。

  • 相対パスを絶対パスに変換したい

    こんにちは。 いつもお世話になっております。 ファイルユーティリティ関連のOCXを作成しておりまして、行き詰まってしまいました。 どうかご教示下さい。 内容はタイトルの通り、相対パスを絶対パスに変換したいというものです。 OCXの作りとして、VBから絶対パス、相対パスが区別なく渡されるものとしてどちらでも絶対パスとして内部的に扱いたく思います。 例えばD:\test\bin、D:\test\workというフォルダが存在するとして、 D:\test\bin\sample.exe内で ".\..\work"が渡された場合に OCX内部で"D:\test\work"に変換するというものです。 以下のようなコードも試してみたのですが、どうもうまく動きません。 if(_fullpath(ApsPath, RelPath, 0x100) == NULL){ //変換失敗の場合 ApsPath = RelPath; } どうかよろしくお願いします。 環境:Windows 2000 VC6.0

  • exeファイルの起動について教えてください

    はじめまして。 現在c言語を勉強しているのですが、プログラム内で別のプログラムのexeファイルを呼び出し起動させたいのですが、サイトをいろいろ回ったのですが上手くいきませんでした。 環境は、Microsoft Visual C++ 2005 Express Edition 現在の呼び出し方法は、 case IDC_AI: /* 表示の次へボタン有効化 */ // SendMessage( hwnd, WM_SETREDRAW, TRUE, 0); /* 表示 */ // ShowWindow( IAhwnd, SW_SHOW); // CGMain(IAhwnd, message, wParam, IParam, nCmdShow2); // ShellExecute(hwnd, "open", "C:\\Documents and Settings\\c319-1037\\デスクトップ\\卒業研究\\プログラム\\11-12\\SQL組と合わせるよう\\Debug\\D3DFWSample2005.exe", NULL, NULL, SW_SHOW); path=(char*)calloc(MAX_PATH+1,sizeof(char)); if(0!=GetModuleFileName( NULL, buf, MAX_PATH )){// 実行ファイルの完全パスを取得 char drive[MAX_PATH+1] ,dir [MAX_PATH+1] ,fname[MAX_PATH+1] ,ext [MAX_PATH+1]; _splitpath(buf,drive,dir,fname,ext);//パス名を構成要素に分解します // file = '"'; // file += "\\"; // file += '"'; file = drive; file += dir; file += "SQL組と合わせるよう\\Debug\\D3DFWSample2005.exe"; // file += '"'; // file += '"'; MessageBox( hwnd, file.c_str(), "完全パス", MB_OK); // MessageBox( hwnd, drive, "ドライブ", MB_OK); // MessageBox( hwnd, dir, "ディレクトリ パス", MB_OK); // MessageBox( hwnd, fname, "ベース ファイル名 (拡張子なし)", MB_OK); } ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); MessageBox( hwnd, "秀丸を起動します", "完全パス", MB_OK); // 秀丸を起動する if( !CreateProcess( NULL, // No module name (use command line). (LPSTR)file.c_str(), // Command line. NULL, // Process handle not inheritable. NULL, // Thread handle not inheritable. FALSE, // Set handle inheritance to FALSE. 0, // No creation flags. NULL, // Use parent's environment block. NULL, // Use parent's starting directory. &si, // Pointer to STARTUPINFO structure. &pi ) // Pointer to PROCESS_INFORMATION structure. ) { MessageBox( hwnd, "CreateProcess failed.", "実行エラー", MB_OK); iRtn = -1; } // Wait until child process exits. WaitForSingleObject( pi.hProcess, INFINITE ); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); MessageBox( hwnd, "秀丸を終了しました", "完全パス", MB_OK); return iRtn; です。 よろしくお願いします。

  • delphiで、末尾のフォルダ名だけを、取得したい。

    delphi6で、アドレスの末尾だけを取得したいのですが、デフォルトで関数はないのでしょうか? c:test\test1\test\koko\main.exe の”koko”を知りたいのです。 ProcessPathや、ドライブを調べる関数はあるのですが。。。 独自で作られた関数は、見かけました。 http://code.nanigac.com/source/view/314 フルアドレスをパス区切り文字で、頭から切っていき、最後にのこす、再帰って感じですねー。 やっぱり、デフォルトで関数はないのでしょうか? もっと、簡単というか、他の方法は?

  • ShellExecute、エクスプローラで選択状態

    お世話になってます。 VC++2010、MFCでファイルリストを生成するプログラムを作っています。 (今回質問した部分以外は正常に動作しています) ファイル生成後、エクスプローラで、生成したリスト(○○.html)を選択状態にしたいです。 しかし、デスクトップ直下に同名のファイル( 例: AlbumList.html )が既にある場合、うまく行きません。 【不具合1】ファイルの生成は意図したディレクトリにされているのに、エクスプローラに「/select」をつけて、開くと、デスクトップ直下の同名のファイル( 例: AlbumList.html )が開かれて(選択されて)しまう   TRACE(_T("◆FileName→%s \r\n" ),FileName);   TRACE(_T("◆savePath→%s \r\n" ),savePath);   //★エクスプローラで開く   ShellExecute( NULL, _T("open"), _T("C:\\WINDOWS\\EXPLORER.EXE"), _T("/select,") + FileName , savePath, SW_SHOWNORMAL ); トレース結果:  ◆FileName→AlbumList.html  ◆savePath→D:\\Visual Studio 2010 - Data\\Projects\\FileListCreator_Shift-JIS(75)\\Debug\\FileListCreator(LIST)\\ エクスプローラに開かれて、選択状態になったファイル  C:\ユーザ\[ユーザ名]\デスクトップ\AlbumList.html 更新されたファイル  D:\Visual Studio 2010 - Data\Projects\FileListCreator_Shift-JIS(75)\Debug\FileListCreator(LIST)\AlbumList.html 【不具合2】デスクトップに ・ FileListCreator.lnk (リンク)(H:\FileListCreator へのリンク) ・ FileListCreator (フォルダ)(デスクトップにおいた FileListCreator.exe が入っているフォルダ)  (C:\Users\[ユーザ名]\Desktop\FileListCreator) があり、FileListCreator.exe から 以下のコードを実行するボタンを押すと、リンクの方が開かれてしまう。 ※リンクフォルダ名、exe名ともに、「FileListCreator」でかつ両方がデスクトップにおかれている場合に問題が起こる。   //http://rararahp.cool.ne.jp/vc/vctips/api.htm   // 実行ファイルのフルパス取得   TCHAR szPath[_MAX_PATH];   GetModuleFileName( NULL, szPath, MAX_PATH);   CString CurDir;   CurDir = CurrentDirFunc(szPath); //szPathからファイル名を取り除くユーザー関数   if (CurDir !=_T("")){     CurDir.Replace(_T("\\"),_T("\\\\"));   }   //★エクスプローラで開く   ShellExecute(NULL, _T("open"), CurDir, NULL, NULL, SW_SHOWNORMAL); リンクファイル名を 「FileListCreator2.lnk」などと違う名前にすると、実行ファイルのディレクトりが正しく開かれる。  →【不具合2】の方は、うまく説明できないので、(1)だけでもお教え下さると嬉しいです。 宜しくお願いします。

  • 値を返さないコード パス

    標準モジュールにFunctionプロシージャーを作ったのですが、 警告 1 関数 'プロシージャー名' には値を返さないコード パスがあります。 実行時に結果が使用されると、null 参照の例外が発生する可能性があります。 という警告が出るのですが、 値を返さないコード パスがどのことを指してるのかわかりません。 Function test() test = "aaa" End Function のように値が返るようにしています。 コードが長すぎてここに記載できないのですが、 値が返るようにしているのに、なぜこのエラーが出てしまうのでしょうか?

  • PHP で動的ファイル出力

    PHP 猛勉強中です、またお世話になりますm( __ __ )m ドキュメントルート外に置いたイメージファイルを HP からリンクして表示できるように readfile 関数を使った PHP ファイルを作成しようと思っています。 readfile.php に対して URL クエリーでhttp://hoge/readfile.php?name=hage&ext=jpg のような感じで呼び出したいと思っています。 ※ name はファイル名、 ext は拡張子です。 [readfile.php] <?php $_name = ""; $_ext = ""; if(isset($_GET["name"]) === true && isset($_GET["ext"]) === true){ // null byte 対策 $_name = delete_nullbyte($_GET["name"]); $_ext = delete_nullbyte($_GET["ext"]); // ディレクトリトラバーサル対策 $_name = str_replace(".", "", @htmlspecialchars($_name, ENT_QUOTES, "UTF-8")); $_ext = str_replace(".", "", @htmlspecialchars($_ext, ENT_QUOTES, "UTF-8")); }else{ exit(); } $_file_path = "/home/xxx/img/" . $_name . "." . $_ext; // ファイル存在確認 if(file_exists($_file_path) === false){ exit(); } // MimeType 取得 $_ext_type = substr($_file_path, -3); $_mime_type = ""; if(strcasecmp($_ext_type, "jpg") === 0){ $_mime_type = "image/jpeg"; _out_file($_file_path, $_mime_type); }else{ exit(); } ///////////////////////////////////////////////// // ファイル出力 function _out_file($file_path, $mime_type) { // ファイル名取得 $_fname = @basename($file_path); // ファイルストリーム取得 header('Content-Type: ' . $mime_type); header("Content-Disposition: inline; filename='" . $_fname . "'"); readfile($file_path); } ///////////////////////////////////////////////// // null byte 除去メソッド function delete_nullbyte($str) { if(is_array($str) === true){ return ""; } return str_replace("\0", "", $str); } ?> 色々作業を進めるうちに「null byte 攻撃」や「ディレクトリトラバーサル攻撃」などの言葉が耳に入ってきてセキュリティ的に不安を感じています。 自分なりに調べて上記のようなコーディングをしましたが、果たして問題が無いのか、それとももっとたくさん考えなくてはならないのか、先輩方の意見が聞きたく質問させていただきました。 よろしくお願いしますm( __ __ )m

    • ベストアンサー
    • PHP
  • ファイルのパスについて

    下記のような構成でプログラムを組んでいます。 ([d]=ディレクトリ、[f]=ファイル) test[d] ├ test_dir[d] │ └ index2.php[f] │ ├ test_dat[d] │ └ data.dat[f] │ ├ index.php[f] └ common.inc[f] common.incにはindex.php、index2.php双方で使う共通関数が入っており、data.datのデータを読み込みます。 その際に、common.incの中でdata.datへのパスを"./test_dir/data.dat"設定しておくと、index2.phpでは「No such file or directory」と言われます。 有用な情報かは分かりませんが、common.incの読み込みにはinclude_onceを使用しています。 index2.phpから見ると当然そのパスは存在しないので理屈は分かりますが、解決方法が思い浮かびません。 引数でdata.datへのパスを渡せば問題なく動くと思いますが、出来ればcommon.inc内で解決したいと考えています。 何か良いの解決策は無いでしょうか?すいませんがよろしくお願いします。

    • ベストアンサー
    • PHP