当前位置:编程学习 > 网站相关 >>

如何将路径转换为长路径名?

当用户将一个文件名拖放到应用程序图标上时,系统传递短路径名到应用的命令行。系统的这样做大概是因为它不能肯定应用程序是否能处理长路径名。奇怪的是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;
}

补充:综合编程 , 安全编程 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,