您的位置:首页 > 其它

VC 获得当前工作路径的方法

2015-05-21 21:50 183 查看
GetCurrentDirectory函数可以获取当前进程的工作路径,函数原型如下:

DWORD GetCurrentDirectory(DWORD nBufferLength, LPTSTR lpBuffer);

nBufferLength:路径长度,取值要比实际路径包含的字符串长度大(存放字符串结束标志符'\0')。lpBuffer:路径字符串缓冲区。

函数调用成功,返回写到缓冲区字符个数,字符串结符'\0'不计算在内。如果参数nBufferLength小于路径长度,函数返回存放路径

需要字符串的长度,字符串结束符'\0'计算在内。假设当前MFC的工程工作路径为D:\GetCurrentDirectoryTest\DirectoryTest。

char DirectoryBuffer[1024] = {'\0'};

int Length1 = GetCurrentDirectory(1024, DirectoryBuffer); //Length1 = 40

int Length2 = GetCurrentDirectory(10, DirectoryBuffer); //Length2 = 41

考虑如下程序:

char DirectoryBuffer[1024] = {'\0'};

GetCurrentDirectory(1024, DirectoryBuffer);

AfxMessageBox(DirectoryBuffer);

运行结果如下:



当调用如下程序Open对话框重新选择路径后,GetCurrentDirectory得到的是最新进程的路径,不再是当前VC工程所在的路径。

CString NewPath;

CFileDialog NewDlg(TRUE); //TRUE为OPEN对话框,FALSE为SAVE AS对话框

if(NewDlg.DoModal() == IDOK)

NewPath= NewDlg.GetPathName();

执行上述程序后,VC会自定弹出对话框,让用户选择某个目录下的文件,如下所示:



假如此时选择C:\Windows\System32\calc.exe,点击Open按钮后,工作路径就会变为C:\Windows\System32,不再是之前的

D:\GetCurrentDirectoryTest\DirectoryTest。运行如下程序:

char DirectoryBuffer[1024] = {'\0'};

CString NewPath;

CFileDialog NewDlg(TRUE); //TRUE为OPEN对话框,FALSE为SAVE AS对话框

if(NewDlg.DoModal() == IDOK)

NewPath= NewDlg.GetPathName();

GetCurrentDirectory(1024, DirectoryBuffer);

AfxMessageBox(DirectoryBuffer);

结果如下:



解决此问题有两种方法,方法一:每次在选择新路径前首先保存当前的工作路径,新路径选择完后,再调用SetCurrentDirectory

函数,将工作路径重新设置为之前的路径。考虑如下程序:

char DirectoryBuffer[1024] = {'\0'};

GetCurrentDirectory(1024, DirectoryBuffer); //保存当前工作路径

CString NewPath;

CFileDialog NewDlg(TRUE);

if(NewDlg.DoModal() == IDOK)

NewPath= NewDlg.GetPathName();

SetCurrentDirectory(DirectoryBuffer); //恢复当前工作路径

AfxMessageBox(DirectoryBuffer);

运行结果如下:



第二种方法是使用GetModuleFileName函数,该函数原型如下:

DWORD GetModuleFileName(HMODULE hModule, LPSTR lpFilename, DWORD nSize);

hModule:装载一个程序实例的句柄,如果为NULL,返回该当前应用程序全路径。lpFileName:存放模块缓冲区指针。nSize:

装载到缓冲区lpFileName的最大值。函数如果调用成功,返回写入缓冲区的字符数,不包括字符串结束符'\0',lpFilename中存放

当前进程已加载模块的文件的完整路径。函数调用失败,返回0。如果所设置的nSize过小,返回所设置缓冲区的大小,包含字符串

结束标志符'\0'。运行如下程序:

char DirectoryBuffer[1024] = {'\0'};

CString NewPath;

CFileDialog NewDlg(TRUE);

if(NewDlg.DoModal() == IDOK)

NewPath= NewDlg.GetPathName();

//Length = 64,第三个参数如果改为10,函数将返回10,DirectoryBuffer中存放的是"D:\\GetCur"。

int Length = GetModuleFileName(NULL, DirectoryBuffer, 1024);

AfxMessageBox(DirectoryBuffer);

Open对话框打开后,无论选择哪个目录下的文件,运行结果都是下面的情况:



由此可见,DirectoryBuffer中存放的是可执行文件的绝对路径,采用CString类的函数去掉字符串"\\Debug\\DirectoryTest.exe",

即可获得当前VC工程所在的路径字符串。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: