C++获取当前目录

摘要:
获取当前目录非常简单。net,更不用说这里了。如果VCMS封装了几个方法:1。最常用的GetCurrentDirectory,请检查其原型:DWORDgetCurrentDirectory;很容易理解,两个参数具有一个长度和一个目标指针Buffer。例如,您可以定义charpath[MAX_PATH],也可以直接使用CStringpath;2.使用GetModuleFileName,例如:HMODULModule=GetModuleHandle;CHARbuf[MAX_PATH];GetModuleFileName;然而,当遇到带有“.”的文件夹时,上述两个目录路径将结束。例如,如果当前程序位于D:myprojecttest-1.0 win-app目录中,如果您想通过GetCurrentDirectory或GetModuleFileName获取当前目录,则永远不会正确。每次都是:D:myprojecttest-1.0目录。删除“1.0”后,您可以正确获取D:myprojecttest-1.0win-app目录。最后,尝试从文件中删除“1.0”,结果是正常的。

获取当前目录对于.net来说很简单,在此不用多说了。C/C++来说挺也简单,但容易掉进MS的陷阱。在此仅作为笔记记录一下方法,以便以后备查,高手请路过。

 若是VC MS 封装了好几个方法

1、最常用的GetCurrentDirectory,查一下它的原型:

 DWORD GetCurrentDirectory(

  DWORD nBufferLength,  // size, in characters, of directory buffer
  LPTSTR lpBuffer       // pointer to buffer for current directory
);

很好理解,两个参数一个长度,一个目标指针Buffer,如:可以定义一个char path[MAX_PATH],也可以直接用CString path;

2、用GetModuleFileName

 如:

 HMODULE module = GetModuleHandle(0); 

CHAR buf[MAX_PATH]; 
GetModuleFileName(module, buf, sizeof buf); 
 

不过以上两种目录路径碰到文件夹带有“.”就完蛋了,如当前程序放在 D:\\myproject\\test-1.0\\win-app\\目录下,要想通过GetCurrentDiretory或GetModuleFileName来获取当前目录(想要得到:D:\\myproject\\test-1.0\\win-app), 永远不正确,每次都是:D:\\myproject\\test-1.0 目录,去掉"1.0"之后,就能正确得到D:\\myproject\\test-1.0\\win-app目录。我不知道这两个函数对于这种情况是BUG还是Ms有意为之。

为了这个问题,我折腾了半天的时间,在开发的时候根本不会想那么多,直接用上上面函数来获取当前程序运行的目录了,结果也都正确,谁知发布的时候我自作聪明在文件夹名称加上版本号,结果死得很惨,上线一用永远得不到正常的结果。。找了半天不知道原因在哪?

最后尝试去文件的"1.0"字样结果就正常了。真是悲剧呀。。。

最后,我决定还是用回标准C++的写法。不相信MS那斯。

其实标准C++的写法更加简单,也有库函数可以调用,_getcwd;

查一下MSDN

char *_getcwd(char *buffer, int maxlen); //ANSI版本
wchar_t *_wgetcwd(wchar_t *buffer, int maxlen ); //Unicode版本

参数说明
buffer:
Storage location for the path.
maxlen:
Maximum length of the path in characters: char for _getcwd and wchar_t for _wgetcwd.
Returns a pointer to buffer.

A NULL return value indicates an error, and errno is set either to ENOMEM,

indicating that there is insufficient memory to allocate maxlen bytes

(when a NULL argument is given as buffer), or to ERANGE, indicating that the path is longer than maxlen characters.

If maxlen is less than or equal to zero, this function invokes an invalid parameter handler, as described in Parameter Validation.


这是MSND上解释,非常好用。。建议大家用这个_getcwd,而不要用MFC那些神话般的函数。
  

免责声明:文章转载自《C++获取当前目录》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇VS2008 在IE中 调试 ActiveX控件 .Android 虹软2.0人脸识别,注册失败问题 分析synchronized的作用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#和C++实现强制结束进程的两种实现方式

强制结束进程的两种实现方式--C#和C++实现   最近在做一个大型的项目,由于进程之间的关联出了一些问题,长话短说,就是我们不得不强制停止某些进程以保证系统正常的运行,在网上找了一下,没发现有这方面详细的介绍和写的比较全面的文章,于是按照MSDN的说明写了两种方法,希望对遇到类似问题的朋友有所帮助。 首先,我们来看看C#的实现方式, 由于C#对进程的封...

vscode利用dev配置c语言,VSCode搭建C++/C调试编译环境(使用DevC++)

关于VSCode使用Dev C++的MinGW64来调试C++/C网上的教程试了很多,大部分都已经过时了或者说是不适配了,最后就选择使用Dev原有的东西来实现,不建议自己下载MinGW64,里面安装的时候有些选项不知道选什么的话很容易出现问题。 配置Dev下MinGW64的路径 假设Dev已经安装好了,然后现在要做的就是将Dev目录下的MinGW添加到环境...

c/c++ 数组传参

在c/c++中,在进行数组传参时,数组的元素个数默认是不作为实参传入调用函数,也就是说c/c++ 不允许向函数传递一个完整的数组作为参数 实例: 1.形式参数是一个指针,实参包括数组长度: 1 void myFunction(int *param,int length){ 2 for (int i = 0; i<length - 1; i...

Visual Studio 2010 C++ 属性设置基础

在 《Visual Studio 2010 C++ 工程文件解读》中提到了C++工程中可以进行用户自定义的属性设置,如何进行属性设置呢? 下面我们来了解一下 props 文件的基本规则: 1、在 PropertyGroup 元素中放置子元素就是定义属性,属性的值就是子元素的内容;例如 <PropertyGroup><OutputDr...

C/C++调用Golang 一

C/C++调用Golang 一 (开发环境: 操作系统: windows 7 32位操作系统 C++: visual studio 2010 Golang:go version go1.9 windows/386 TDM-GCC-32) 用一个简单的例子演示如何在C++中调用golang程序。用golang编写一个简单的函数,编译成动态链接...

Ubuntu下搭建C++开发环境

Ubuntu使用eclipse搭建c/c++编译环境----CDT插件 Ubuntu(Linux)使用Eclipse搭建C/C++编译环境          这两天,给自己电脑弄了双系统,除了原来的Windows 7系统外,装上了Linux系统,使用的版本是Ubuntu(点击可到相应的下载页面)。开始我装的Linux版本是fedora9,对于一个根本没接触...