VC++中如何获得一个当前进程的运行目录
2014-11-18 21:43
483 查看
利用windows API获得:
CString GetAppPath() {
CString strAppPath; // 保存结果
TCHAR szModuleFileName[MAX_PATH]; // 全路径名
TCHAR drive[_MAX_DRIVE]; // 盘符名称,比如说C盘啊,D盘啊
TCHAR dir[_MAX_DIR]; // 目录
TCHAR fname[_MAX_FNAME]; // 进程名字
TCHAR ext[_MAX_EXT]; //后缀,一般为exe或者是dll
if (NULL == GetModuleFileName(NULL, szModuleFileName, MAX_PATH)) //获得当前进程的文件路径
return FALSE;
_tsplitpath_s( szModuleFileName, drive, dir, fname, ext ); //分割该路径,得到盘符,目录,文件名,后缀名
strAppPath = drive;
strAppPath += dir;
return strAppPath;
}
以上代码在VS2008可编译并运行。(要求MFC application或dll)
一、
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++)
{
if (_szPath
!=_T('\\'))
{
strPath +=_szPath
;
}
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的用法:
[cpp]
view plaincopy
#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所在目录某个文件的完整路径函数:
[cpp]
view plaincopy
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);
}
[cpp]
view plaincopy
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为文件后缀。
[cpp]
view plaincopy
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);
CString GetAppPath() {
CString strAppPath; // 保存结果
TCHAR szModuleFileName[MAX_PATH]; // 全路径名
TCHAR drive[_MAX_DRIVE]; // 盘符名称,比如说C盘啊,D盘啊
TCHAR dir[_MAX_DIR]; // 目录
TCHAR fname[_MAX_FNAME]; // 进程名字
TCHAR ext[_MAX_EXT]; //后缀,一般为exe或者是dll
if (NULL == GetModuleFileName(NULL, szModuleFileName, MAX_PATH)) //获得当前进程的文件路径
return FALSE;
_tsplitpath_s( szModuleFileName, drive, dir, fname, ext ); //分割该路径,得到盘符,目录,文件名,后缀名
strAppPath = drive;
strAppPath += dir;
return strAppPath;
}
以上代码在VS2008可编译并运行。(要求MFC application或dll)
一、
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++)
{
if (_szPath
!=_T('\\'))
{
strPath +=_szPath
;
}
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的用法:
[cpp]
view plaincopy
#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所在目录某个文件的完整路径函数:
[cpp]
view plaincopy
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);
}
[cpp]
view plaincopy
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为文件后缀。
[cpp]
view plaincopy
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);
相关文章推荐
- VC++中如何获得一个当前进程的运行目录
- VC++获得当前进程运行目录的方法
- VC下写入txt的一点总结&&如何获得当前应用程序的目录&&获得系统日期时间
- C#编程:如何获得当前进程运行路径
- [Windows Mobile 6.x] 如何获得当前运行的所有进程
- [Windows Mobile 6.x] 如何获得当前运行的所有进程
- 如何获得当前运行模块在进程地址空间的位置
- 如何获得当前运行模块在进程地址空间的位置
- 如何获得当前运行模块在进程地址空间的位置
- Android-如何获得当前正在运行的activity和进程的相关信息
- 如何获得当前运行模块在进程地址空间的位置
- 如何获得当前本进程所在的目录
- VC获得系统当前进程以及某进程使用的模块的方法
- 如何在VC程序中获得当前显示器的分辨率
- 如何获得某一个目录下的文件列表?
- VC如何判断当前进程处在Administrator权限下
- VC程序中如何结束系统正在运行的其他进程
- NSIS如何在安装前结束当前运行的进程
- 如何获得各个运行进程的id
- VC如何判断当前进程处在Administrator权限下