65.9K
CodeProject 正在变化。 阅读更多。
Home

CPath 1.2 - 轻松处理路径字符串

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (21投票s)

2002年8月7日

5分钟阅读

viewsIcon

193205

downloadIcon

2237

一个用于处理路径字符串、解析命令行参数和获取文件属性的类

Sample Image - image.gif

引言

  • 当前版本:1.2
  • CPath 需要链接 shlwapi.lib

我能用这个类做什么?

  • 将路径字符串拆分成各个组成部分
  • 命令行参数解析
  • 将相对路径转换为绝对路径,反之亦然
  • 获取文件属性(大小和日期)
  • 等等!

如何开始使用这个类?

  • 调用 SetPath 方法
  • 使用两个重载构造函数之一来构造对象,它们接受与 SetPath 的两个版本相同的参数。
  • 使用赋值运算符

该类不仅处理本地路径,还处理网络路径和相对路径。

// Calling the SetPath method
CPath path1;
path1.SetPath("c:\\temp\\file.txt");

// Using an overloaded constructor
CPath path2("\\\\servername\\temp\\file.txt");

// Using the asignment operator
CPath path3;
path3 = "c:\\temp\\file.txt";

SetPath 方法和重载构造函数

CPath(LPCTSTR szPath, BOOL bIsFolderPath = FALSE, BOOL bHasArguments = FALSE)

void SetPath(LPCTSTR szPath, BOOL bIsFolderPath = FALSE, BOOL bHasArguments = FALSE)

  • szPath 是一个以 null 结尾的字符串,包含路径。
  • 如果 szPath 代表一个文件夹路径,但不能确定它是否以斜杠或反斜杠('/' 或 '\')结尾,则必须将 bIsFolderPath 设置为 TRUE。为什么这很重要?嗯,想象一下您将字符串 "c:\\temp\\subfolder" 传递给此方法。如果 bIsFolderPath 没有设置为 TRUE,则该类会将其解释为 "subfolder" 是一个没有扩展名的文件名。
  • 如果 szPath 字符串包含参数,则将 bHasArguments 设置为 TRUE。如果发生这种情况,但 HasArguments 没有设置为 TRUE,则路径将无法正确拆分/解析。

CPath(DWORD dwSpecial) / void SetPath(DWORD dwSpecial)

  • dwSpecial 可以取以下值之一
    • PATH_CMDLINE - 将路径和参数设置为 GetCommandLine() 返回的值。(GetCommandLine 函数返回一个指向当前进程命令行字符串的指针)
    • PATH_MODULE - 将路径设置为从 GetModuleFileName 返回的值,其中 hModule 设置为 NULL。(如果此参数为 NULLGetModuleFileName 会返回用于创建调用进程的文件的路径)

我到底能从每个 Get... 函数中得到什么?

我们将通过示例来了解这一点,因为这很容易理解但很难解释。以下路径将被使用

  1. c:\folder\subfolder\localfile.ext
  2. \\server\folder\netfile.ext
  3. ..\images\picture.jpg
函数 返回值 1 返回值 2 返回值 3
GetDrive c    
GetDir \folder\subfolder\ \\server\folder\ ..\images\
GetDirCount 2 2 2
GetLocation c:\folder\subfolder\ \\server\folder\ ..\images\
GetFileName localfile.ext netfile.ext picture.jpg
GetFileTitle localfile netfile 图片
GetExtension .ext .ext .jpg
GetExtName ext ext jpg

CString GetPath(BOOL bAppendArgs = FALSE, BOOL bOriginal = FALSE)

返回对象中包含的路径。如果 bAppendArgsTRUE,则会附加参数(如果有)。如果 bOriginalTRUE,则返回传递给 SetPath 或构造函数的相同字符串。

CString GetShortPath() / CString GetLongPath()

返回路径的短格式和长格式版本。如果文件或文件夹不存在,则返回的 CString 将为空。

获取其他信息

CString GetDriveLabel(BOOL bPCNameIfNetwork = FALSE)

返回驱动器的标签,如果驱动器单元不存在则为空。如果 bPCNameIfNetworkTRUE 且路径是网络路径,则返回值将是服务器的名称。

BOOL GetFileSize(__int64 &nSize)

文件的大小,如果路径是文件夹路径或文件不存在,则为 0。

BOOL GetFileTime(CTime &time, DWORD dwType = FILE_WRITE)

一个 CTime 对象,包含文件创建时间 (FILE_CREATION)、最后写入时间 (FILE_WRITE) 或最后访问时间 (FILE_ACCESS)。

BOOL IsLocalPath()

如果路径是本地路径,则返回 TRUE。对于网络和相对路径,返回 FALSE

BOOL IsRelativePath()

对于相对路径返回 TRUE

BOOL IsFilePath()

对于包含文件名的路径返回 TRUE

BOOL ExistFile()

如果文件存在,则返回 TRUE。如果 IsFilePath 返回 FALSE,此方法也将返回 TRUE

BOOL ExistLocation()

如果位置存在,则返回 TRUE。请参阅 GetLocation

运算符

operator LPCTSTR ()

返回指向路径数据的临时字符指针。请勿存储此指针,如果您稍后需要在代码中使用此值,请复制它所指向的字符串。

// You can use it as a parameter in a call to another function ...
CPath path("c:\\folder\\file.txt");
SomFunction(32, (LPCTSTR) path);

// ... or to make a copy
CString s;
s = path;

const CPath& operator = (LPCTSTR szPath)

SetPath(szPath) 相同。请参阅 SetPath 方法和重载构造函数。

const CPath& operator = (CPath &ref)

将右侧的 ref 对象复制到左侧。

CPath path1("c:\\folder\\file.txt"), path2;
path2 = path1;

// Now path2 has the same data as path1

参数处理

CPath 可以解析带标志或不带标志的参数,解析不带参数的标志,并识别包含用引号括起来的空格的参数。让我们通过一个使用以下参数的示例来了解这一点

-s /f 2510 nfparam1 -list "c:\a folder\file.lst" nfparam2

目录 标志 参数
0 s  
1 f 2510
2   nfparam1
3 列表 c:\a folder\file.lst
4   nfparam2

CString GetArgument(int nIndex = -1, BOOL bGetFlag = FALSE)

返回基于 0 的 nIndex 参数字符串。如果 nIndex = -1,则返回的字符串是路径的参数部分。如果 GetFlagTRUE,则返回基于 0 的 nIndex 参数标志。

int FindArgument(LPCTSTR szFlag)

返回与 szFlag 匹配的参数的基于 0 的索引。如果找不到标志,则返回值为 -1。

int GetArgCount()

返回参数的数量。

void SetArguments(LPCTSTR szArgs)

设置当前文件路径的参数。(提示:您可以传递 "" 来重置此值)。

CPath path;
CString str;

path = "c:\\folder\\app.exe";
path.SetArguments("/type 5 /skin \"blue force\" go");
str = path.GetPath(TRUE);
// str equals now  c:\folder\app.exe /type 5 /skin "blue force" go

void AddSetArgument(LPCTSTR szFlag, LPCTSTR szArgument)

添加一个带有标志的新参数,或者如果 szFlag 为 "" 或 NULL 则不带标志。或者只是一个标志或开关。参数 szFlag 可以带有 '/' 和 '-' 前缀。如果找不到这两个字符中的任何一个,标志指示符默认为 '/'。

CPath path("c:\\folder\\app.exe");
CString str;

path.AddArgument("-x", NULL);
path.AddArgument("file", "c:\\My Folder\\list.txt");

str = path.GetPath(TRUE);
// str equals now  c:\folder\app.exe -x /file "c:\\My Folder\list.txt"

相对路径方法

CString GetAbsolutePath(LPCTSTR szBaseFolder)

如果 CPath 对象中的路径不是相对路径,则返回的 CString 将为空。否则,将使用 szBaseFolder 作为根路径来正确组合 CPath 中路径的结果。

CPath path("..\\images\\picture.jpg");
CString str;
str = path.GetAbsolutePath("c:\\projects\\doc");
// str is now  c:\projects\images\picture.jpg

CString GetRelativePath(LPCTSTR szBaseFolder)

如果 CPath 对象中的路径是相对路径,则返回的 CString 将为空。否则,将返回 CPath 中的值相对于 szBaseFolder(作为根路径)的相对路径。

CPath path("c:\\projects\\images\\picture.jpg");
CString str;
str = path.GetRelativePath("c:\\projects\\doc");
// str is now  ..\images\picture.jpg

反斜杠静态方法

static CString AddBackSlash(LPCTSTR szFolderPath, BOOL bInverted = FALSE)

如果 szFolderPath 没有以反斜杠(如果 bInvertedTRUE 则为 '/')结尾,则在其后附加一个反斜杠。

static CString RemoveBackSlash(LPCTSTR szFolderPath)

删除 szFolderPath 末尾的尾随反斜杠(或普通斜杠),如果找到的话。

历史

版本 1.2

  • 移除了对 AfxMessageBox 的调试调用。
  • 修复了 RemoveBackSlash 中的错误(将 && 替换为 ||)。
  • GetFileSizeGetFileTime 被重新定义为返回一个布尔值。
  • 改进了参数处理例程。
  • 添加了 AddSetArgumentRemoveArgument 方法。
  • 两个 operator = 现在都返回对自身的常量引用(const CPath&)。
© . All rights reserved.