CPath - 轻松处理文件名
一个基于(并改进了)Shell Lightweight 实用程序 API 的路径字符串包装类。
最新更改 (2005 年 8 月)
引言
CPath
是一个针对 Windows 上的路径和文件名进行了定制的字符串类。
处理文件名通常很麻烦
- 使用
&
进行正确连接:file = path & subfolder & name;
。 - 修改:
BuildRoot
、AddExtension
等。 - 拆分成组件(路径、文件名、标题、扩展名、父文件夹、根目录和单独的元素)。
- 清理,例如修剪、取消和重新引用。
- 一键式读写注册表。
- 展开/折叠环境变量。
- 检测路径类型(
IsRoot
、IsURL
等)以及各种根类型(驱动器、长路径、服务器、共享、协议、伪协议)。 - 基本文件系统操作:
FileExists
等。 - 常用助手,如
GetModuleFileName
。
该项目包含一个测试应用程序,您可以在其中随意操作、探索和测试功能。
设计和依赖项
主要设计目标是方便使用。它基于 CString
并使用 Shell Lightweight Path Helper API,因此不适合可移植应用程序。
您必须知道的事项
构造和赋值(来自任何 CString
)将执行一些路径清理。默认情况下,这包括:删除引号、修剪空格(内部和外部)、折叠自引用和上层引用(“..
”和“.
”)、将 UNC 长路径规范(“\\?\C:\
”)替换为实际根目录,以及展开环境变量。有关其他选项,请参阅 EPathCleanup
。
提取: CPath
提供了一个 operator LPCTSTR
(类似于 CString
)。CPath::GetStr()
检索路径,并允许应用“重新打包”选项。默认情况下,超出 MAX_PATH
的路径将接收其 UNC 前缀。有关更多选项,请参阅 EPathPacking
。使用 CPath::GetStr(0)
来检索未修改的包含路径作为 CString
(避免复制)。
错误处理: CPath
函数通常会回退到“合理的默认处理”。对于访问文件系统的函数,请调用 GetLastError()
来检索错误信息。
您可能想知道的事情
» 使用 '&' 连接:CPath path = CPath("C:\\temp") & "foo.txt";
。
» 将路径拆分成组件:
String root = path.GetRoot(); CPath folder = path.GetPath(); CString fileName = path.GetName(); CString fileTitle = path.GetTitle(); CString ext = path.GetExtension();
» 链式命令:path.Trim().RemoveQuotes()
。
» 获取应用程序目录:nsPath::GetModuleFileName().GetPath()
。
文档
完整的文档(由 Doxygen 生成)可在下载中找到(HTML / HTMLHelp)。
您想为您的代码创建类似的文档吗?我的 Doxygen 文章会告诉您如何做。
实现说明
我没有使用 CPathT
,因为该类是为 VC6 项目设计的(该项目不会很快移植到 VC7),而 CPathT
包含与 Shell 辅助函数相同的错误功能。
我确实使用了 CString
,因为它在 MFC 项目之外(使用 WTL,或 DevStudio 的“提取 CString
实现”宏,或 CString
克隆类)很方便。此外,保证的引用计数实现允许使用方便的 API,而不会带来太多性能影响。
与 CString
一样,当 CPath
作为“未知”参数传递给具有可变参数列表的函数时,它将充当 LPCTSTR
。但请记住,这对于其他编译器来说不是可移植的。
更改日志
请注意:在 2005 年 3 月更新时,在合并两个略有不同的分支时,引入了重大更改。不幸的是,我选择了保持我的代码库不变,没有考虑到发布的文章。(我希望您不太介意,并且仍然喜欢这次更新。)所有更改都会导致编译器错误。
- 2004 年 6 月 20 日:初始发布。
- 2004 年 6 月 22 日
- 修复:
nsPath::CPath::MakeSystemFolder
正确实现了 unmake。 - 添加:
nsPath::CPath::MakeSystemFolder
和nsPath::CPath::SearchOnPath
在函数成功时将 Windows 错误代码设置为零(感谢 Hans Dietrich)。 - 修复:
nsPath::CPath
在警告级别 -W4 下可以正确编译。
- 修复:
- 2005年3月3日
- Doxygen 类成员文档现在使用组以便更好地导航。
- 修复:
GetStr
中的eppAutoQuote
错误(感谢 Stlan)。 - Added
FromRegistry
、ToRegistry
GetRootType
GetRoot
有新的实现。MakeAbsolute
、MakeRelative
、MakeFullPath
EnvUnexpandRoot
、EnvUnexpandDefaultRoots
。
- 重大 更改(抱歉)
GetRoot
->ShellGetRoot
(以区别于新的、扩展的GetRoot
实现)。GetFileName
-->GetName
(一致性)。GetFileTitle
-->GetTitle
(一致性)。- 将创建函数设为
nsPath
命名空间中的独立函数(它们很好地隐藏在命名空间中,因此可以避免冲突)。
- 2005年3月17日
- 修复了
GetFileName
中的错误(现在是GetName
):如果路径以反斜杠结尾,GetFileName
会返回整个路径而不是空字符串(感谢 woodland)。
- 修复了
- 2005年8月25日
- 修复:
GetStr()
在包含空格的字符串时未自动加引号(即使提供了eppAutoQuote
,这也是默认设置)。注意:此修复程序会更改默认行为,并可能在某些情况下破坏现有代码(例如,将
path.GetStr()
传递给一个不喜欢引号的函数)。 - 添加了
SplitRoot
(将第一个元素与其余部分分开)。 - 添加了
IsDot
、IsDotDot
(用于检查“.”、“.. ”路径),以及IsDotty
(如果为“.”或“.. ”则为 true)。名称很奇怪 - 有建议吗? - 添加了
IsValid
,用于检查 Windows 命名约定。 - 修复了与
CStdString
不兼容的问题(导致在分配空路径时出现访问冲突)。
- 修复: