GetLongPathName和GetShortPathName

引言

上一篇文章介绍了 SHGetSpecialFolderPath该api用来获取指定的系统路径。

GetLongPathNameGetShortPathName函数分别用来将文件全路径字符串转换为不缩写的全路径缩写的全路径字符串。

这两个函数极其重要!!!很多人写程序时不注意这一点——包括我,比如,使用GetModuleFileName获取文件路径,我们一般都将获取到的路径直接拿来用。在99.9%的情况下,我们获取到的是没有缩写的全路径,但是,某些情况下,获取到的却是缩写的,例如,

C:\Prog~1\Comm~1\aaa~1.exe

如果这个时候,取进程的名称,将得到aaa~1.exe,很明显,这种结果是我们所不愿意看到的,它会导致很严重的问题,而这种错误又是极其难以查找的。

所以,个人认为,在获取文件全路径后,都应该调用GetLongPathName,以便保证得到的路径不是缩写形式。

0x01.GetLongPathName函数

DWORD WINAPI GetLongPathName(
    LPCTSTR lpszShortPath,//指定的要转换的路径
    LPTSTR  lpszLongPath, //接收长路径的缓冲区
    DWORD   cchBuffer     //缓冲区长度
);

函数说明:

将指定的路径转化成长路径形式

返回值:
函数执行成功则返回lpszLongPath接收的字符串长度,不包括空字符;如果lpszLongPath长度太小,则函数返回接收长路径需要的缓冲区长度,包括空字符,因此如果返回值大于cchBuffer,则应重新分配lpszLongPath,使其长度足够容纳长路径;如果函数因为其他原因失败则返回0,可以通过GetLastError()获取错误信息。

0x02.GetShortPathName函数

DWORD WINAPI GetShortPathName(
  _In_  LPCTSTR lpszLongPath,   //指定的要转换的路径
  _Out_ LPTSTR  lpszShortPath,  //接收短路径形式的缓冲区
  _In_  DWORD   cchBuffer       //缓冲区的长度
);

函数说明:

获取指定路径的短路径形式

返回值:

如果执行成功,则返回lpszShortPath接收的字符串的长度,不包括空字符;如果lpszShortPath长度太小,则返回lpszShortPath接收短路径字符串需要的长度,包括空字符;如果其他原因导致失败,则返回0,通过GetLastError()获取出错信息。

0x03.使用例子:

//...
long     length = 0;
TCHAR*   buffer = NULL;

// First obtain the size needed by passing NULL and 0.
length = GetShortPathName(lpszPath, NULL, 0);
if (length == 0)
     ErrorExit(TEXT("GetShortPathName"));

// Dynamically allocate the correct size 
// (terminating null char was included in length)
buffer = new TCHAR[length];

// Now simply call again using same long path.
length = GetShortPathName(lpszPath, buffer, length);
if (length == 0)
    ErrorExit(TEXT("GetShortPathName"));

_tprintf(TEXT("long name = %s shortname = %s"), lpszPath, buffer);

delete [] buffer;
///...

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值