windows开发中长短路径的问题

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

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

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

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

0x01.GetLongPathName函数
DWORD WINAPI GetLongPathName(
    LPCTSTR lpszShortPath,//指定的要转换的路径
    LPTSTR  lpszLongPath, //接收长路径的缓冲区
    DWORD   cchBuffer     //缓冲区长度
);
1
2
3
4
5
函数说明:

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

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

0x02.GetShortPathName函数
DWORD WINAPI GetShortPathName(
  _In_  LPCTSTR lpszLongPath,   //指定的要转换的路径
  _Out_ LPTSTR  lpszShortPath,  //接收短路径形式的缓冲区
  _In_  DWORD   cchBuffer       //缓冲区的长度
);
1
2
3
4
5
函数说明:

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

返回值:

如果执行成功,则返回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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

--------------------- 
作者:ktpd_pro 
来源:CSDN 
原文:https://blog.csdn.net/ktpd_pro/article/details/56667179 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(C++)