如何将路径转换为长路径名?
当用户将一个文件名拖放到应用程序图标上时,系统传递短路径名到应用的命令行。系统的这样做大概是因为它不能肯定应用程序是否能处理长路径名。奇怪的是MFC不把路径名转换为长路径。这样就使得应用程序看起来不那么专业,因为它们只能显示短版文件名。
以前我写了一段代码来转换命令行文件名为长版文件名。这次我想对这个代码进行扩展并解决原来的一个缺陷。以前的程序虽然能运行,但它只能吸取长版文件名,不是整个路径。所以我打算将它做得更通用一些,可以转换任何存在的路径名为长版路径名。
过去我使用的方法是用给定的文件名调用FindFirstFile函数,它只返回一个存在的文件或目录的长版名,而不是整个路径。下面的代码解决了这个问题,它解析每一个目录或文件名并将它转换为它们的长版路径名。
注意:在Windows的API中有一个函数GetLongPathName(...)也能做相同的事情,但是,它只能在WIN98或WINDOWS NT,WINDOW 2000及以后的版本中运行。如果你想让你的代码在所有WIN 32操作系统中运行,那你最好还是避开这个API函数为妙。define PATH_DELIMITER \
//
BOOL MyGetLongPathName(LPTSTR lpszShortPath, LPTSTR lpszLongPath)
{
TCHAR *p, *pStart;
TCHAR buff[MAX_PATH];
WIN32_FIND_DATA wfd;
HANDLE handle;
int i;// 初始化,保证串是“NULL”结尾
*buff = ;
*lpszLongPath = ;
//
p = lpszShortPath;
while (p != NULL) {// 找下一个
p = strchr(pStart = p, PATH_DELIMITER);// 检查是否找到\
if (p != pStart) {
i = strlen(buff);
// 插入\到临时缓冲
if (p == NULL)
strcpy(buff + i, pStart);
else {
*p = ;
strcpy(buff + i, pStart);
*p = PATH_DELIMITER;
}// 拷贝\盘符
if (strchr(buff + i, :) != NULL)
strcat(lpszLongPath, buff + i);
else {
// 转换为长版名
handle = FindFirstFile(buff, &wfd);
if (handle == INVALID_HANDLE_value)
return FALSE;
strcat(lpszLongPath, wfd.cFileName);
FindClose(handle);
}
}// 空结尾
if (p != NULL) {
buff[i = strlen(buff)] = *p;
buff[i + 1] = ;
lpszLongPath[i = strlen(lpszLongPath)] = *p;
lpszLongPath[i + 1] = ;
}// 走指针
if (p) p++;
}
return TRUE;
}
补充:综合编程 , 安全编程 ,