获取文件的绝对路径, GetCurrentDirectory()和GetModuleFileName()函数的区别

转自http://blog.sina.com.cn/s/blog_780976a001015k1q.html和http://blog.csdn.net/kzh313561014/article/details/6630643

想要访问执行程序(.exe)路径下的文件,有以下几个步骤:

   1.先通过函数GetModuleFileName获取执行程序的绝对路径

   TCHAR szPath[ MAX_PATH ] = {0};
    GetModuleFileName(NULL, szPath, MAX_PATH );

   其中GetModuleFileName函数为windows的API函数,使用的时候需要包含windows.h的头文件;MAX_PATH是一个宏定义,值为260。执行完GetModuleFileName函数之后,szPath数组中保存的就是执行程序当前的绝对路径。

假设执行程序xp.exe的绝对路径为C:\ProgramFiles\Dll\xp.exe,那么szPath数组中存储的值就是C:\ProgramFiles\Dll\xp.exe。

   2.根据执行程序的绝对路径得到需要访问的文件的绝对路径。

   这里需要用到_tcsrchr函数来将获取到的执行程序的绝对路径中的执行程序的名称去掉。即将上面路径C:\ProgramFiles\Dll\xp.exe中的xp.exe去掉,只得到C:\ProgramFiles\Dll\。方法如下:

   (_tcsrchr(szPath,_T('\\')))[1] = 0;

   注:_tcsrchr包含在头文件tchar.h中。

   3.将要访问的文件的名称添加到已经得到的路径中。

   假设需要访问的文件是1.txt,那么如下:

    CString strPath = szPath;
    strPath = strPath + "1.txt";

    在非MFC中,CString包含在atlstr.h头文件中,在MFC中包含在cstring.h的头文件中。

    程序整体如下:

    TCHAR szPath[ MAX_PATH ] = {0};
    if ( GetModuleFileName( NULL, szPath,MAX_PATH ) )
    {
     (_tcsrchr(szPath,_T('\\')))[1] = 0;
    }

    CString strPath = szPath;
    strPath = strPath + "1.txt";

========================================

GetCurrentDirectory只是返回当前进程的当前目录,而并不是进程的镜像文件(.exe)所在的目录
GetCurrentDirectory()适用于XP等系统,在WinCE上不能使用
GetModuleFileName()适用于WinCE2.0以后
使用方法:
//下面的一段代码主要是获得当前程序的运行目录(.exe)所在的目录
{
    CString path;
    GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
    path.ReleaseBuffer();
    int pos = path.ReverseFind('\\');
    path = path.Left(pos);
}

GetModuleFileName函数

WINAPI DWORD GetModuleFileName( 
  HMODULE hModule,
  LPWSTR lpFilename, 
  DWORD nSize
);

      GetBuffer和ReleaseBuffer是一套需要配合使用的函数, 与GetBufferSetLength相比, 优点是如果分配的空间大于实际保存的字符串(0结尾),
ReleaseBuffer会把多余申请的空间释放, 归还给系统; 但使用时需要注意以下问题: 如果要保存的字符串为abc(0结尾),则GetBuffer参数应至少
为3; 如果要保存的内容不是以0结尾, 比如是读取文件数据, 则GetBuffer参数如果大于文件长度时,ReleaseBuffer参数一定要为文件长度(如果
GetBuffer参数为文件长度的话不存在问题,ReleaseBuffer参数可以为默认-1)!
 GetBufferSetLength相对比较容易理解, 它申请一个指定长度的空间, 即使里面最终保存的字符串长度小于申请的空间长度, 也不会将
多余空间释放.
__________________________________________________________________________________________________________________
DWORD GetCurrentDirectory(
  DWORD nBufferLength,
  LPTSTR lpBuffer
);
The GetCurrentDirectory function retrieves the current directory for the current process.
GetCurrentDirectory返回当前进程的当前目录,并不一定返回你的应用程序的目录。如果你在应用程序中调用了打开文件对话框,你选择了一个文件,那么,这个文件所在的目录就成了当前进程的当前目录了。
Parameters
nBufferLength: 接收保存路径的字符串缓存长度, 缓存必须有一个保存结束的空字符的位置.
lpBuffer:指向接收字符串的缓存,收到的非空字符串指定了当前目录的绝对路径. 
DWORD GetModuleFileName(
  HMODULE hModule,
  LPTSTR lpFilename,
  DWORD nSize
);
GetModuleFileName 函数指定当前进程模块的路径.它仅仅操作当前进程下的模块.如果想获取其他进程下的模块信息, 则需使用 GetModuleFileNameEx 函数.
Parameters
hModule:模块的句柄,或者设置为NULL表示当前模块。
lpFilename:保存路径的缓冲区。
nSize:缓冲区的大小。
例子:
 TCHAR strExePath[_MAX_PATH];
 GetModuleFileName(NULL,strExePath,_MAX_PATH);
 PathRemoveFileSpec(strExePath);
如果当前执行程序的位置为c:\test.exe,GetModuleFileName获取的strExePath即为c:\test.ext,通过去掉名称函数最终获得的strExePath为c:。(注意PathRemoveFileSpec 系统API函数调用时必须包含#include  "Shlwapi.h"作为头文件)
 TCHAR strExePath[_MAX_PATH];
 GetCurrentDirectory(_MAX_PATH, strExePath);
 获取当前的系统目录,可能是c:也可能是其他值。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值