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

CPathSplit

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.28/5 (12投票s)

2003年8月21日

Zlib

3分钟阅读

viewsIcon

105676

downloadIcon

1097

基于 CString 的路径分割器。

CPathSplitTest.png - 503 * 348 - 11840 bytes

引言

我需要一个与 CString 兼容的路径分割器,所以这是我非常方便的版本 ;) 它完全符合网络路径规范,并且兼容 Windows CE……

分割路径

两种分割路径的方式

在构造函数中

创建分割器对象时

CString l_oStrPath;
l_oStrPath = "C:\\Windows\\test.txt";

CPathSplit l_oPathSplit(l_oStrPath);

创建后

将另一个路径分解

CString l_oStrPath;
CPathSplit l_oPathSplit;
l_oStrPath = "C:\\Windows\\test.txt";
 
l_oPathSplit.Split(l_oStrPath);

CPathSplit::Split() 返回 true 表示路径有效且已成功分割,否则返回 false

获取路径元素

路径结构

typedef enum ePathElement
{ ePATHEL_DRIVE = 0
, ePATHEL_DIRECTORY
, ePATHEL_FILENAME
, ePATHEL_EXTENSION
, ePATHEL__END
};

现在提供了一个 enum 列表,以便选择路径元素。

对于磁盘驱动器:l_oStrFullPath = "C:\Windows\test.txt"
对于网络驱动器:l_oStrFullPath = "\\Server_remote\Charles\test.txt"
对于 Pocket PC 驱动器:l_oStrFullPath = "\Storage Card\test.txt"

下表显示了哪个枚举元素对应哪个路径元素


枚举元素 磁盘驱动器 网络驱动器 Pocket PC 驱动器
ePATHEL_DRIVE "C:" "" (空) "" (空)
ePATHEL_DIRECTORY "\Windows\" "\Server_remote\Charles\" "\Storage Card\"
ePATHEL_FILENAME "test" "test" "test"
ePATHEL_EXTENSION ".txt" ".txt" ".txt"

获取路径元素

下表显示了哪个函数返回哪个路径元素


函数 枚举元素
GetDrive() ePATHEL_DRIVE
GetDirectory() ePATHEL_DIRECTORY
GetFileName() ePATHEL_FILENAME
GetExtension() ePATHEL_EXTENSION

路径被分割后,您可以检索每个元素。

例如,路径 "C:\Windows\test.txt" 已被分割

返回驱动器

l_oStrDrive = l_oPathSplit.GetDrive();

l_oStrDrive = "C:"

返回目录

l_oStrDirectory = l_oPathSplit.GetDirectory();

l_oStrDirectory = "\Windows\"

返回不带扩展名的文件名

l_oStrFileName = l_oPathSplit.GetFileName();

l_oStrFileName = "test"

返回文件扩展名(包含点)

l_oStrFileExtension = l_oPathSplit.GetExtension();

l_oStrFileExtension = ".txt"

获取路径的组合

您现在也可以检索完整限定路径的完整部分。

返回完整路径

l_oStrFullPath = l_oPathSplit.GetPath();

l_oStrFullPath = "C:\Windows\test.txt"

返回路径的开头,包括末尾的路径元素

l_oStrPathFile = l_oPathSplit.GetPath(ePATHEL_FILENAME);

l_oStrPathFile = "C:\Windows\test"

返回路径的开头并添加一个队列字符串

l_oStrFileExt = ".html";
l_oStrPathCustom = l_oPathSplit.GetPath(ePATHEL_FILENAME, &l_oStrFileExt);

l_oStrPathCustom = "C:\Windows\test.html"

返回路径的一部分,从一个元素到另一个元素

l_oStrPathPart = l_oPathSplit.GetPath(ePATHEL_FILENAME, NULL, 
                                      ePATHEL_DIRECTORY);

l_oStrPathPart = "\Windows\test"

结论

对于网络驱动器或 Pocket PC 驱动器,没有驱动器盘符

l_oStrPath = "\\\\Windows\\test.txt"; // or "\\Windows\\test.txt"
l_oPathSplit.Split(l_oStrPath);
l_oStrDrive = l_oPathSplit.GetDrive();

l_oStrDrive = ""

扩展名始终包含点!

历史

  • 2004/03/13 - 1.03:修改核心以提高可用性和部分检索能力
  • 2003/08/22 - 1.02:为嵌入式路径分割器添加了空默认构造函数
  • 2003/08/21 - 1.01:根据 Eddie Velasquez 和 Marga.FP 的意愿进行的修改
  • 2003/08/21 - 1.00:CPathSplit 的首次发布

注意

如果它看起来有点奇怪,我很抱歉,我知道有很多很多路径分割器。但由于它使用了 CString,这个在 Windows CE 上也运行得相当好 ;) 它无意取代其他具有正则表达式等的分割器!它**仅仅**是一个小巧且微不足道的路径分割器供您享用,所以不要留下差评,因为它不过是几十行 MFC 代码而已;)

关于一些人可能觉得奇怪的缩进:我知道它看起来真的很丑,但我尝试了 Concurrent Clean 语言,它缩进的方式让我非常满意。它几乎将所有内容(甚至测试语句)都结构化为每行一个指令。因此,代码的清晰度非常好,让我想起了汇编,在汇编中你不能在一行中放多个指令。调试时也更容易,通过转到正确的行,你可以自动找到有问题的指令。你不必抓耳挠腮地寻找导致崩溃的指令 ;) 而且当你是一个像我这样的**编译定义**狂热者(曾经的嵌入式编码员)时,它也非常……干净。还可以轻松注释每一行和/或每个参数!

CPathSplit - CodeProject - 代码之家
© . All rights reserved.