c/c++ 获取当前程序(EXE)所在的路径

一、

1.只获得路径字串不包含文件名

TCHAR szFilePath[MAX_PATH + 1]={0};
GetModuleFileName(NULL, szFilePath, MAX_PATH);
(_tcsrchr(szFilePath, _T('\\')))[1] = 0; // 删除文件名,只获得路径字串
CString str_url = szFilePath;  // 例如str_url==e:\program\Debug\
---------------------------------------------------------
2.获得双斜杠路径不包含文件名

TCHAR _szPath[MAX_PATH + 1]={0};
GetModuleFileName(NULL, _szPath, MAX_PATH);
(_tcsrchr(_szPath, _T('\\')))[1] = 0;//删除文件名,只获得路径 字串
CString strPath;
for (int n=0;_szPath[n];n++)
{
if (_szPath[n]!=_T('\\'))
{
strPath +=_szPath[n] ;
}
else
{
strPath += _T("\\\\");
}
}

MessageBox(strPath);//输出==e:\\program\\Debug\\


二、
1:获取应用程序自身完整路径文件名
方法1:
#include "stdlib.h"
void main()
{
cout << _pgmptr << endl;
}

方法2:
char szFullPath[MAX_PATH];
ZeroMemory(szFullPath,MAX_PAT);
::GetModuleFileName(NULL,szFullPath,MAX_PATH);
::MessageBox(NULL,szFullPath,"path",MB_ICONINFORMATION);

方法3:
TCHAR szPath[MAX_PATH] = {0};
if(!GetModuleFileName(NULL, szPath, MAX_PATH))
{ return ; }
AfxMessageBox(szPath);

2:如何获取应用程序所在目录?
这里值得注意的是很多人都用
GetCurrentDirectory(MAX_PATH, szCurrentPath);
来获取。这个方法并不好,经常出错,比如现在我有一个程序在d:\test目录下,现在运行这个程序后用GetCurrentDirectory得到的是d:\test

。接着在程序里用CFileDialog来打开一个C:\test\test.txt文件后再调用GetCurrentDirectory,那么得到的szCurrentPath就是C:\test而不是d:\test。

推荐用如下方法来得到当前程序所在目录比较安全:
void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext );
函数来分解开始提到的_pgmptr,然后再用
void _makepath( char *path, const char *drive, const char *dir, const char *fname, const char *ext );
函数来对分解后的路径进行组合。这两个函数结合起来功能强大,使用灵活,基本上所有的有关目录和路径方面的操作都可以搞定。

转载于:http://hi.baidu.com/wyuanshiy/blog/item/7818a5ec6ffab422269791dc.html

 

 MSDN的用法:

# include <stdlib.h>
  • #include <stdio.h>
  • int main( void )
  • {
  • char path_buffer[_MAX_PATH];
  • char drive[_MAX_DRIVE];
  • char dir[_MAX_DIR];
  • char fname[_MAX_FNAME];
  • char ext[_MAX_EXT];
  • errno_t err;
  • err = _makepath_s( path_buffer, _MAX_PATH, "c", "\\sample\\crt\\",
  • "crt_makepath_s", "c" );
  • if (err != 0)
  • {
  • printf( "Error creating path. Error code %d.\n", err);
  • exit( 1);
  • }
  • printf( "Path created with _makepath_s: %s\n\n", path_buffer );
  • err = _splitpath_s( path_buffer, drive, _MAX_DRIVE, dir, _MAX_DIR, fname,
  • _MAX_FNAME, ext, _MAX_EXT );
  • if (err != 0)
  • {
  • printf( "Error splitting the path. Error code %d.\n", err);
  • exit( 1);
  • }
  • printf( "Path extracted with _splitpath_s:\n" );
  • printf( " Drive: %s\n", drive );
  • printf( " Dir: %s\n", dir );
  • printf( " Filename: %s\n", fname );
  • printf( " Ext: %s\n", ext );
  • }

    我自己写了个合成当前EXE所在目录某个文件的完整路径函数:

    void make_full_path (char* s, int nLen, const char *file_name, const char*file_ext)
  • {
  • char szPath[MAX_PATH]={ 0};
  • GetModuleFileNameA( NULL, szPath, MAX_PATH);
  • char cDir[ 100] = "";
  • char cDrive[ 10] = "";
  • char cf[ 20] = "";
  • char cExt[ 10] = "";
  • _splitpath_s(szPath, cDrive, cDir, cf, cExt);
  • _makepath_s(s, nLen, cDrive, cDir, file_name, file_ext);
  • }
  •  

    string GetExePath (void)
  • {
  • char szFilePath[MAX_PATH + 1]={ 0};
  • GetModuleFileNameA( NULL, szFilePath, MAX_PATH);
  • ( strrchr(szFilePath, '\\'))[ 0] = 0; // 删除文件名,只获得路径字串
  • string path = szFilePath;
  • return path;
  • }

  • 参数说明:

    s用来接收完整路径;

    nLen缓冲区长度;

    file_name为文件名称,不带后缀;

    file_ext为文件后缀。

     

    FILE *f;
  • TCHAR szFilePath[MAX_PATH + 1]={ 0};
  • sprintf_s(szFilePath, "%s", g_file_in.c_str());
  • //GetModuleFileName(NULL, szFilePath, MAX_PATH);
  • ( strrchr(szFilePath, '.'))[ 1] = 0;
  • sprintf_s(szFilePath, "%soutput.txt", szFilePath);
  • fopen_s(&f, szFilePath, "a+");
  • fwrite(strLog.c_str(), 1, strlen(strLog.c_str()), f);
  • fclose(f);
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值