日常工作问题总结(三十一)windows获取路径的几个函数GetCurrentDirectory,GetModuleFileName,GetFullPathName

     windows现在具体有多少个获取路径的函数本人不清楚,今天暂时讲下上面提到的几个windows函数。

   

1.GetCurrentDirectory

 

DWORD GetCurrentDirectory(DWORDnBufferLength, //sizeofdirectorybuffer
LPTSTRlpBuffer //directorybuffer
);

函数功能

获取当前进程的当前目录。
注意当前目录这东西有点怪异,本来确实是可执行文件的所在目录,但是当用文件对话框成功打开一个文件后,该目录就被修改为被打开的文件所在目录。比如在程序中使用"123.txt"这样的文件名,希望将它存储在exe文件所在目录中,但是当用户用文件对话框打开一个文件"F:\456.txt"后,这个123.txt会被存储到F盘下。(VC2005下的情况,其他VC版本待验证)

参数说明

参数 类型及说明
nBufferLength 缓冲区的长度
lpBuffer 指定一个预定义字串,用于装载当前目录

返回值

调用成功 返回装载到lpBuffer的字节数。
使用GetLastError函数可获得错误信息。

 

2.GetModuleFileName,GetFullPathName

DWORD GetFullPathName(
 
LPCTSTR lpFileName, // file name
 
DWORD nBufferLength, // size of path buffer,建议取值为:MAX_PATH
 
LPTSTR lpBuffer, // path buffer
 
LPTSTR *lpFilePart // address of file name in path
 
);
 
功能说明
 
从一指定文件得到文件的路径
 
参数说明
 
LPCTSTR lpFileName, 指定文件的名字
 
DWORD nBufferLength,缓存区的大小
 
LPTSTR lpBuffer, 用于存放路径的缓存区
 
LPTSTR *lpFilePart 文件名的起始地址

DWORD WINAPI GetModuleFileName(
HMODULE hModule,
LPTSTR lpFileName,
DWORD nSize
);


 

GetModuleFileName(NULL,szText,MAX_PATH);//只有第一个参数为NULL,返回当前模块的PathName,否则返回对应dll路径
GetFullPathName("",MAX_PATH,szText,NULL);//根据第一个参数提供的文件名(可用相对路径,8.3格式)扩充到含驱动器和目录
GetModuleFileName 是取一个模块(exe,dll)在磁盘上的路径。
 GetFullPathName 是把一个8.3格式(dos)的路径转换为长文件名格式。


3.GetCurrentDirectory()和GetMoudleFileName()区别

 char* pCurrDir = new char[260];
 ::GetCurrentDirectory(260,pCurrDir);
 delete pCurrDir;

 char* pModuleDir = new char[260];
 ::GetModuleFileName(NULL,pModuleDir,260);
 delete pModuleDir;

上面代码执行完成后(调试状态):

pCurrDir:"C:\\Users\\dell\\Desktop\\共享内存\\MySharedServer\\MySharedServer"

pModuleDir:"C:\\Users\\dell\\Desktop\\共享内存\\MySharedServer\\Debug\\MySharedServer.exe"

还记得上面看GetCurrentDirectory()函数的函数描述么?什么是当前进程的当前目录?

 

我自己写了一些代码进行测试,一般在一个进程空间内,这两个得到的地址区别在于“有没有***.exe”应用程序的名称,其他都是一致的,那么为什么有当前目录这个概念?

 

详解:

GetCurrentDirectory这个是函数原型,他是主要是作用是获取程序的当前目录,大部分指的是当前运行程序所在的运行目录。记得这个地方说的是大部分情况,不是所有,有些特殊的情况会返回时其他的路径。

LPSTR lpath("C:\\Users\\dell\\Desktop\\共享内存\\MySharedServer\\Debug\\MySharedServer.exe");
	if( !CreateProcess( NULL,
		lpath,
		 NULL, 
		NULL,
		FALSE,//1.重点
		 0,
 		NULL,
 		NULL, 
		&m_ClientSI,
		&m_ClientPI) )
	{
		ZeroMemory( &m_ClientSI, sizeof(m_ClientSI) );
		m_ClientSI.cb = sizeof(m_ClientSI);
	}


 

上面代码不要看字面意思,思路是:用client1进程创建子进程client2,而在client2进程中使用GetCurrentDirectory()和GetModuleFileName()两个函数,此时得出的结果是完全不一样的。

GetCurrentDirectory()得到的是client1客户端的运行目录,GetModuleFileName()得到的还是Client2.exe的应用程序目录。

 

//下面的一段代码主要是获得当前程序的运行目录(.exe)所在的目录
{
    CString path; 
    GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH); 
    path.ReleaseBuffer(); 
    int pos = path.ReverseFind('\\'); 
    path = path.Left(pos); 
}


 

后来查看了一些资料,微软也承认这个函数有时候不是那么恰当,他的这个获取的值收到很多的影响,所以如果只是为了获取当前程序运行路径,建议使用GetModuleFileName这个函数来处理,这个比较准,因为他获得是当前运行程序的存储路径。

 

 

 


 

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,可以使用不同的方法来获取当前路径。其中一种方法是使用Windows.h头文件中的GetCurrentDirectory函数。这个函数的原型是DWORD GetCurrentDirectory(\[in\] DWORD nBufferLength, \[out\] LPTSTR lpBuffer)。你可以在程序中包含Windows.h头文件,并使用GetCurrentDirectory函数获取当前路径。例如,你可以使用以下代码来获取当前路径: #include <iostream> #include <Windows.h> using namespace std; int main(void) { char buf\[1000\]; GetCurrentDirectory(1000, buf); cout << buf << endl; system("pause"); return 0; } 另一种方法是使用getcwd函数。你可以在程序中包含头文件<direct.h>,并使用getcwd函数获取当前路径。例如,你可以使用以下代码来获取当前路径: #include <iostream> #include <direct.h> using namespace std; int main(void) { char *buffer; buffer = getcwd(NULL, MAX_PATH); if (buffer != NULL) { cout << buffer << endl; } return 0; } 除了以上两种方法,还可以使用GetModuleFileName函数获取当前路径。你可以在程序中包含Windows.h头文件,并使用GetModuleFileName函数获取当前路径。例如,你可以使用以下代码来获取当前路径: #include <iostream> #include <Windows.h> using namespace std; int main(void) { char defaultPath\[MAX_PATH\]; GetModuleFileName(NULL, defaultPath, MAX_PATH); cout << defaultPath << endl; return 0; } 希望这些方法能够帮助到你获取C++ Windows中的当前路径。 #### 引用[.reference_title] - *1* *3* [C++ 获取当前程序路径](https://blog.csdn.net/jg_csdn/article/details/129436817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【C++】获取当前文件所在绝对路径 && GetCurrentDirectory()函数使用详解](https://blog.csdn.net/Miller_6/article/details/125804594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值