函数原型为 DWORD
GetCurrentDirectory(
DWORD
nBufferLength,
// size of directory buffer缓冲区的长度
LPTSTR
lpBuffer
// directory buffer指定一个预定义字串,用于装载当前目录
);
GetCurrentDirectory只是返回操作系统的当前目录,并不一定返回你的应用程序的目录。
比如你在应用程序中调用了打开文件对话框,你选择了一个文件,那么,这个文件所在的目录就成了操作系统的当前目录了。因此,千万不要用这个函数作为获取应用程序目录的手段。 获取当前应用程序主目录的方法是GetModuleFileName,先获取应用程序文件路径,然后截取调应用程序文件名称就是应用程序主目录了。
PS:应该用GetModuleFileName函数,然后.exe文件名去掉,就是当前路径了。
GetModuleFileName获取绝对路径
在三峡程序中,打开一个TXT文件,读取数据然后画图的函数中,有下列代码: CString FilePathName;
char path[MAX_PATH];
CFileDialog dlg(TRUE);
//保存当前路径
GetCurrentDirectory(MAX_PATH,path);
// 文件目录保存在path这个字符数组中,
if (dlg.DoModal()==IDOK) // 在这里,用文件对话框成功打开一个文件后,该目录就被修改为被打开的文件所在目录了
{
FilePathName=dlg.GetPathName();
system.setReplayFile(FilePathName);
// 实际上是把这个文件名保存在CDataRecord类的 readFileDir 这个成员变量里
}
else
{
}
//恢复当前路径
SetCurrentDirectory(path);
// 使目录重新恢复成了path这个目录
具体GetCurrentDirectory、SetCurrentDirectory和GetModuleFileName的用法,可参考下面文章:
DWORD GetCurrentDirectory(
DWORD nBufferLength, // size of directory buffer
LPTSTR lpBuffer// directory buffer
);
函数功能:
找到当前进程的当前目录(.dsw所在文件夹)
参数说明:
参数 类型及说明
nBufferLength 缓冲区的长度
lpBuffer 指定一个预定义字串,用于装载当前目录
返回值
调用成功 返回装载到lpBuffer的字节数。
如nBufferLength的长度不够,不足以容纳目录,则返回值是必要的缓冲区长度(要求至少这个长度),其中包括空中止字符。零表示失败。使用GetLastError函数可获得错误信息
BOOL SetCurrentDirectory(
LPCTSTR lpPathName
);
函数是设置当前路径,函数的返回值如果是0,表示设置失败,如果不是0,表示设置成功;
GetModuleFileName函数原型
DWORD GetModuleFileName(
HMODULE hModule,// handle to module。将要得到的模块的句柄。如果是当前模块,NULL
LPTSTR lpFilename,// path buffer得到的文件名。
DWORD nSize// size of buffer一般MAX_PATH就可以了
);
举个简单的例子:
GetCurrentDirectory(BUFSIZE, Buffer);
GetModuleFileName(NULL, szPath, sizeof(szPath));
//NULL是当前模块
查看Buffer 是:"C:\Documents and Settings\All Users\桌面\test"
查看szPath 是:"C:\Documents and Settings\All Users\桌面\test\Debug\test.exe"获得的是模块的完整路径名;
程序例子:
#include "StdAfx.h"
#include
#define BUFSIZE MAX_PATH
int main()
{
TCHAR Buffer[BUFSIZE];
DWORD dwRet;
dwRet = GetCurrentDirectory(BUFSIZE, Buffer);
if( dwRet == 0 )//返回零表示得到文件的当前路径失败,所谓当前路径就是.dsw所在的文件夹
{
printf("GetCurrentDirectory failed (%d)",GetLastError());
return 0;
}
if(dwRet > BUFSIZE) //如果超过了最大字符数,则提示越界,MAX_PATH 是260
{
printf("GetCurrentDirectory failed (buffer too small,need %d chars)\n"), dwRet);
return 0;
}
SetCurrentDirectory("C:\\");
//是指把进程的当前路径换成:C:\
//如果:SetCurrentDirectory("..")就是设置目录为当前目录的上级目录;
return 1;
}
VC中使用GetModuleFileName获取应用程序路径:(这里的路径是绝对路径)
.\\与API函数GetModuleFileName获取应用程序目录有何不一样?
--------------------------------------------------------------------------------
.\\是得到应用程序的当前目录,但当前目录不一定等于应用程序执行文件的所在目录,一个应用程序被启动时,当前目录是可以被任意设置的。
GetModuleFileName()得到模块的完整路径名,例如,你载入c:\windows\system32\a.dll,得到模块句柄h,则你可以用GetModuleFileName()得到h模块的完整路径名。
--------------------------------------------------------------------------------
.\\一般用在包含头文件的语句中。
另一个是程序编译后起作用的,例如,打开自定义的配置文件等。
--------------------------------------------------------------------------------
如何去取得这个Hanlde?
--------------------------------------------------------------------------------
如果你直接用LoadLibrary()或AfxLoadLibrary()载入dll,该函数返回值就是handle;
如果你隐式载入dll, 用GetModuleHandle("dll文件名")也可以得到handle;
MFC程序得到本身路径
在开发工程中,往往需要知道当前程序本身所在目录。
一种方法是在程序安装的时候利用安装程序把文件路径写入注册表。在较大的程序中,这种方法比较常用
另一种,就是在程序得到路径。这样,程序随便移动到哪里,都可以得到正确的路径。
具体可参考http://kulong0105.blog.163.com/blog/static/174406191201011701454805/