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

CPath - 轻松处理文件名

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (25投票s)

2004年6月20日

CPOL

4分钟阅读

viewsIcon

167462

downloadIcon

3636

一个基于(并改进了)Shell Lightweight 实用程序 API 的路径字符串包装类。

最新更改 (2005 年 8 月)

引言

CPath 是一个针对 Windows 上的路径和文件名进行了定制的字符串类。

处理文件名通常很麻烦

  • 使用 & 进行正确连接: file = path & subfolder & name;
  • 修改:BuildRootAddExtension 等。
  • 拆分成组件(路径、文件名、标题、扩展名、父文件夹、根目录和单独的元素)。
  • 清理,例如修剪、取消和重新引用。
  • 一键式读写注册表。
  • 展开/折叠环境变量。
  • 检测路径类型(IsRootIsURL 等)以及各种根类型(驱动器、长路径、服务器、共享、协议、伪协议)。
  • 基本文件系统操作:FileExists 等。
  • 常用助手,如 GetModuleFileName

该项目包含一个测试应用程序,您可以在其中随意操作、探索和测试功能。

Sample screenshot

设计和依赖项

主要设计目标是方便使用。它基于 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::MakeSystemFoldernsPath::CPath::SearchOnPath 在函数成功时将 Windows 错误代码设置为零(感谢 Hans Dietrich)。
    • 修复:nsPath::CPath 在警告级别 -W4 下可以正确编译。
  • 2005年3月3日
    • Doxygen 类成员文档现在使用组以便更好地导航。
    • 修复:GetStr 中的 eppAutoQuote 错误(感谢 Stlan)。
    • Added
      • FromRegistryToRegistry
      • GetRootType
      • GetRoot 有新的实现。
      • MakeAbsoluteMakeRelativeMakeFullPath
      • EnvUnexpandRootEnvUnexpandDefaultRoots
    • 重大 更改(抱歉)
      • GetRoot -> ShellGetRoot(以区别于新的、扩展的 GetRoot 实现)。
      • GetFileName --> GetName(一致性)。
      • GetFileTitle --> GetTitle(一致性)。
      • 将创建函数设为 nsPath 命名空间中的独立函数(它们很好地隐藏在命名空间中,因此可以避免冲突)。
  • 2005年3月17日
    • 修复了 GetFileName 中的错误(现在是 GetName):如果路径以反斜杠结尾,GetFileName 会返回整个路径而不是空字符串(感谢 woodland)。
  • 2005年8月25日
    • 修复GetStr() 在包含空格的字符串时未自动加引号(即使提供了 eppAutoQuote,这也是默认设置)。

      注意:此修复程序会更改默认行为,并可能在某些情况下破坏现有代码(例如,将 path.GetStr() 传递给一个不喜欢引号的函数)。

    • 添加了 SplitRoot(将第一个元素与其余部分分开)。
    • 添加了 IsDotIsDotDot(用于检查“.”、“.. ”路径),以及 IsDotty(如果为“.”或“.. ”则为 true)。名称很奇怪 - 有建议吗?
    • 添加了 IsValid,用于检查 Windows 命名约定。
    • 修复了与 CStdString 不兼容的问题(导致在分配空路径时出现访问冲突)。
© . All rights reserved.