教程中国
PHOTOSHOP CS9.0中文版 MAYA 8.5 FOR WINDOWS Corel Painter v9.0 Flash MX2004 中文版 Illustrator cs2 中文版
VC++6.0含sp6 中英文版 VB6.0 +sp6 简体中文版 Borland Delphi 7汉化版 MSDN for vb6.0中文版 Visual Studio 2005简体
教程中国下属 文件存储共享专家BIBIDU.COM 提供大型软件,教材,源码,电影,音乐,图书等下载 更多精品请点此进入
  您目前所在位置: 教程中国 >> 编程基地 >> C++ >> 将路径转换为长路径名 RSS订阅
将路径转换为长路径名
教程(视频,书籍)下载:  ASP.NET AutoCAD 数据库 C# ASP java photoshop 网页设计 delphi 3dmax Flash C++ VB 张孝祥 实例   更多请进入BIBIDU搜索
IT搜索引擎   

记得以前讨论过这方面的问题,就是当用户将一个文件名拖放到应用程序图标上时,系统传递短路径名到应用的命令行。系统的这样做大概是因为它不能肯定应用程序是否能处理长路径名。奇怪的是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 = '\0';
   *lpszLongPath = '\0';
   //
   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 = '\0';
            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] = '\0';
         lpszLongPath[i = strlen(lpszLongPath)] = *p;
         lpszLongPath[i + 1] = '\0';
      }

      // 走指针
      if (p) p++;
   }
   return TRUE;
}

 

来源:十度教育
作者:
关键字:
发表日期:2006-6-29 1:37:06

网页显示有限 阅读全文请下载本文完整版WORD文档

上一篇:C++中用vectors改进内存的再分配   下一篇:C++/VC++编程中的疑难问题及解答


2008-8-21 14:46:29
本文的相类似文章
在学习中进步 在进步中成长 教程中国相随您的成长之路
华腾联合科技股份有限公司版权所有
广告联系:Rosibo@163.com