⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utilclass.cpp

📁 这是一个软件水平资格考试中使用的CASL汇编语言的编译器,实现文件中包括一个编译器,一个虚拟机,一个类似于Debug的调试器.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// UtilClass.cpp: implementation of the CUtilClass class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "UtilClass.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CUtilClass::CUtilClass()
{

}

CUtilClass::~CUtilClass()
{

}

/////////////////////////////////////////////////////////////////////////
//函数名称:GetRelativePath
//函数功能:--------------------得到字符串argOriginalPath中存放的全路径相对于argReferPath中存放的路径的相对路径-----------------
//入口参数:string argReferPath------------------------参照路径(含文件名) 
//          string argOriginalPath---------------------需要得到相对路径的路径(含文件名)
//出口参数: string& argRetPath--------------------得到的相对路径结果
//返回值: UTIL_STATUS----------标识操作状态,UTIL_OK表示操作成功
//开发人员:杨军
//开发日期:2004-5-25
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
CUtilClass::UTIL_STATUS CUtilClass::GetRelativePath(string argReferPath, string argOriginalPath, string& argRetPath) 
{
  //------------------变量定义部分  begins------------------------------
  CStringArray strReferPathArray;
  CStringArray strOriginalPathArray;

  CString strOriginalDrive;
  CString strReferDrive;
  CString strOriginalPath;
  CString strReferPath;
  CString strOriginalFileName;
  CString strReferFileName;
  CString strOriginalExt;
  CString strReferExt;

  int iSize = 0;
  int i = 0;
  int j = 0;
  //------------------变量定义部分  ends--------------------------------
  argRetPath.empty();

  //分解源路径
  _tsplitpath(argOriginalPath.c_str(), strOriginalDrive.GetBuffer(MAX_PATH), strOriginalPath.GetBuffer(MAX_PATH), strOriginalFileName.GetBuffer(MAX_PATH), strOriginalExt.GetBuffer(MAX_PATH));
  strOriginalDrive.ReleaseBuffer();
  strOriginalPath.ReleaseBuffer();
  strOriginalFileName.ReleaseBuffer();
  strOriginalExt.ReleaseBuffer();

  //分析相对路径
  _tsplitpath(argReferPath.c_str(), strReferDrive.GetBuffer(MAX_PATH), strReferPath.GetBuffer(MAX_PATH), strReferFileName.GetBuffer(MAX_PATH), strReferExt.GetBuffer(MAX_PATH));
  strReferDrive.ReleaseBuffer();
  strReferPath.ReleaseBuffer();
  strReferFileName.ReleaseBuffer();
  strReferExt.ReleaseBuffer();

  //去除分解出的字符串数据左右两端的空格
  strOriginalDrive.TrimLeft();
  strOriginalDrive.TrimRight();

  strOriginalPath.TrimLeft();
  strOriginalPath.TrimRight();

  if (strOriginalPath.IsEmpty() || strReferPath.IsEmpty())
  {
    return UTIL_FAILED;
  }
  if ('\\' == strOriginalPath[0])
  {
    strOriginalPath.Delete(0, 1);
  }

  strOriginalFileName.TrimLeft();
  strOriginalFileName.TrimRight();

  strOriginalExt.TrimLeft();
  strOriginalExt.TrimRight();

  strReferDrive.TrimLeft();
  strReferDrive.TrimRight();

  strReferPath.TrimLeft();
  strReferPath.TrimRight();
  if ('\\' == strReferPath[0])
  {
    strReferPath.Delete(0, 1);
  }

  strReferFileName.TrimLeft();
  strReferFileName.TrimRight();

  strReferExt.TrimLeft();
  strReferExt.TrimRight();

  //如果两个路径所处的分区不同,则不再计算其相对路径,直接使用绝对路径
  if (strOriginalDrive.Compare(strReferDrive))
  {
    argRetPath = argOriginalPath;
    return UTIL_OK;
  }

  //如果两个路径所处的分区相同,则开始计算源路径相对于目标路径的相对路径
  //unfinished!
  //int iRet = strOriginalPath.Replace(_T('\\'), _T('/'));
  //iRet = strReferPath.Replace(_T('\\'), _T('/'));

  if (UTIL_OK != SplitStringBySeparator(strOriginalPath, _T('\\'), strOriginalPathArray))
  {
    return UTIL_FAILED;
  }
  if (UTIL_OK != SplitStringBySeparator(strReferPath, _T('\\'), strReferPathArray))
  {
    return UTIL_FAILED;
  }
  
  iSize = min(strReferPathArray.GetSize(), strOriginalPathArray.GetSize());

  for (i = 0; i < iSize; i++)
  {
    //比较过程中发现有不相同的路径的话
    if (strReferPathArray[i].Compare(strOriginalPathArray[i]))
    {
      break;
    }
  }

  //如果参考路径中所包含的子路径数 < 源路径中所包含的子路径数
  if (strReferPathArray.GetSize() < strOriginalPathArray.GetSize())
  {
    j = i;
    for (; i < iSize; i++)
    {
      argRetPath = argRetPath + _T("..\\");
    }

    iSize = strOriginalPathArray.GetSize();

    for (i = j; i < iSize; i++)
    {
      argRetPath = argRetPath + (LPCTSTR)strOriginalPathArray[i] + _T("\\");
    }
  }
  //如果参考路径中所包含的子路径数 = 源路径中所包含的子路径数
  else if (strReferPathArray.GetSize() == strOriginalPathArray.GetSize())
  {
    if (i == iSize)
    {
      argRetPath = _T(".\\");
    }
    else
    {
      j = i;
      for (; i < iSize; i++)
      {
        argRetPath = argRetPath + _T("..\\");
      }

      for (i = j; i < iSize; i++)
      {
        argRetPath = argRetPath + (LPCTSTR)strOriginalPathArray[i] + _T("\\");
      }
    }
  }
  //如果参考路径中所包含的子路径数 > 源路径中所包含的子路径数
  else
  {
    j = i;
    iSize = strReferPathArray.GetSize();
    for (; i < iSize; i++)
    {
      argRetPath = argRetPath + _T("..\\");
    }

    iSize = strOriginalPathArray.GetSize();
    for (i = j; i < iSize; i++)
    {
      argRetPath = argRetPath + (LPCTSTR)strOriginalPathArray[i] + _T("\\");
    }
  }

  argRetPath = argRetPath + (LPCTSTR)strOriginalFileName + (LPCTSTR)strOriginalExt;
  return UTIL_OK;
}


/////////////////////////////////////////////////////////////////////////
//函数名称:SplitStringBySeparator
//函数功能:--------------------以argSeparator为分隔符,分解argSrc将分解后的结果放入argResult------------------------------------
//入口参数:CString argSrc--------------------待分解的字符串
//          TCHAR argSeparator----------------分隔符 
//出口参数: CStringArray& argResult--------------存放分解后的结果
//返回值:无
//开发人员:杨军
//开发日期:2004-5-25
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
CUtilClass::UTIL_STATUS CUtilClass::SplitStringBySeparator(CString argSrc, TCHAR argSeparator, CStringArray& argResult)
{
  //------------------变量定义部分  begins------------------------------
  CString strTemp(_T(""));
  int iIndex = 0;
  //------------------变量定义部分  ends--------------------------------
  //首先清空结果数组
  argResult.RemoveAll();

  while (-1 != (iIndex = argSrc.Find(argSeparator, 0)))
  {
    strTemp = argSrc.Mid(0, iIndex);
    argResult.Add(strTemp);
    argSrc.Delete(0, iIndex + 1);
  }
  
  if (!argSrc.IsEmpty())
  {
    argResult.Add(argSrc);
  }

  return UTIL_OK;
}


/////////////////////////////////////////////////////////////////////////
//函数名称:GetPathOfFile
//函数功能:--------------------获得全路径名文件的路径----------------------------------------------------------------------
//入口参数:CString argFullName----------文件的全路径名
//出口参数: CString-------------文件所在路径
//返回值:无
//开发人员:杨军
//开发日期:2004-5-26
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
CString CUtilClass::GetPathOfFile(CString argFullName) 
{
  int iIndex = argFullName.ReverseFind('\\');

  if (iIndex >= 0)
  {
    return argFullName.Mid(0, iIndex);
  }
  else
  {
    return argFullName;
  }
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -