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






4.84/5 (21投票s)
2002年8月7日
5分钟阅读

193205

2237
一个用于处理路径字符串、解析命令行参数和获取文件属性的类
引言
- 当前版本: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
。(如果此参数为NULL
,GetModuleFileName
会返回用于创建调用进程的文件的路径)
我到底能从每个 Get... 函数中得到什么?
我们将通过示例来了解这一点,因为这很容易理解但很难解释。以下路径将被使用
- c:\folder\subfolder\localfile.ext
- \\server\folder\netfile.ext
- ..\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)
返回对象中包含的路径。如果 bAppendArgs
为 TRUE
,则会附加参数(如果有)。如果 bOriginal
为 TRUE
,则返回传递给 SetPath
或构造函数的相同字符串。
CString GetShortPath()
/ CString GetLongPath()
返回路径的短格式和长格式版本。如果文件或文件夹不存在,则返回的 CString
将为空。
获取其他信息
CString GetDriveLabel(BOOL bPCNameIfNetwork = FALSE)
返回驱动器的标签,如果驱动器单元不存在则为空。如果 bPCNameIfNetwork
为 TRUE
且路径是网络路径,则返回值将是服务器的名称。
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,则返回的字符串是路径的参数部分。如果 GetFlag
为 TRUE
,则返回基于 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
没有以反斜杠(如果 bInverted
为 TRUE
则为 '/')结尾,则在其后附加一个反斜杠。
static CString RemoveBackSlash(LPCTSTR szFolderPath)
删除 szFolderPath
末尾的尾随反斜杠(或普通斜杠),如果找到的话。
历史
版本 1.2
- 移除了对
AfxMessageBox
的调试调用。 - 修复了
RemoveBackSlash
中的错误(将 && 替换为 ||)。 GetFileSize
和GetFileTime
被重新定义为返回一个布尔值。- 改进了参数处理例程。
- 添加了
AddSetArgument
和RemoveArgument
方法。 - 两个 operator = 现在都返回对自身的常量引用(
const CPath&
)。