长短路径转换

来源:百度文库 编辑:神马文学网 时间:2024/04/28 01:31:35
用过 GetLongPathName API函数的人都知道,它是一个Platform SDK中用于文件I/O的一个函数,但是它只能在Windows 98 和 Windows 2000 中使用。本文提供一个MFC 全程仿真函数 GetLongPathNameThis,这个函数可以在所有Win32 OS中使用。

/*

头文件
Module : LONGPATH.H
Purpose: Interface for a function to emulate GetLongPathName on all Win32 OS's
Created: PJN / 16-06-1999
History:

Copyright (c) 1999 by PJ Naughter.  
All rights reserved.

*/

/////////////////////////////////  Defines  //////////////////////////////////
#ifndef __LONGPATH_H__
#define __LONGPATH_H__

////////////////////////////// Functions  ////////////////////////////////////

BOOL GetLongPathName(const CString& sFilename, CString& sLongFilename);

#endif // __LONGPATH_H__

/*

实现文件
Module : LONGPATH.CPP
Purpose: Implementation for a function to emulate GetLongPathName on all Win32 OS's
Created: PJN / 16-06-1999
History:

Copyright (c) 1999 by PJ Naughter.  
All rights reserved.

*/

/////////////////////////////////  Includes  //////////////////////////////////
#include "stdafx.h"
#include "longpath.h"

/////////////////////////////////  Defines ////////////////////////////////////
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

////////////////////////////// Implementation /////////////////////////////////

BOOL GetLongPathName(const CString& sFilename, CString& sLongFilename)
{
  //First get the long filename version of the filename  
  WIN32_FIND_DATA fd;
  HANDLE hFind = FindFirstFile(sFilename, &fd);
  if (hFind != INVALID_HANDLE_VALUE)
  {
    FindClose(hFind);
    sLongFilename = fd.cFileName;
  }
  else
    return FALSE;
 
  //Now get the long filename version of each part of the path
  int nSlash = sFilename.ReverseFind(_T('\\'));
  CString sTemp(sFilename);
  while (nSlash != -1)
  {
    sTemp = sTemp.Left(nSlash);

    if (sTemp.GetLength() != 2)
    {
      HANDLE hFind = FindFirstFile(sTemp, &fd);
      if (hFind != INVALID_HANDLE_VALUE)
      {
        FindClose(hFind);
        sLongFilename = CString(fd.cFileName) + _T("\\") + sLongFilename;
      }
      else
      {
        sLongFilename = sTemp + _T("\\") + sLongFilename;
        sTemp.Empty();
      }
    }
    else
    {
      sLongFilename = sTemp + _T("\\") + sLongFilename;
      sTemp.Empty();
    }
     
    nSlash = sTemp.ReverseFind(_T('\\'));
  }

  return TRUE;
}