
正文
Windows路径操作API函数学习
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
前言
在VC++开发过程中,经常需要用到一些路径操作,比如拼需要的文件路径,搜索路径中的内容等等。Windows提供了一套关于路径操作的API帮助我们更好的执行这些操作。
路径截断与合并API
PathRemoveArgs 去除路径后面的参数
PathRemoveBackslash*去除路径最后的反斜杠“\”
PathAddBackslash*在路径最后加上反斜杠“\”
PathRemoveBlanks* 去除路径前后的空格
PathAddExtension*在文件路径后面加上扩展名
PathRemoveExtension*去除文件路径扩展名
PathRenameExtension*更改文件路径扩展名
PathRemoveFileSpec* 去除文件名,得到目录
PathUnquoteSpaces*去除路径中的首尾开始的引号
PathQuoteSpaces判断路径中是否有空格,有就是用双引号把整个路径包起来
PathAppend 将一个路径追加到另一个路径后面
PathCombine 合并两个路径
PathSkipRoot 去掉路径中的磁盘符或UNC部分
PathStripPath去掉路径中的目录部分,得到文件名
PathStripToRoot 去掉路径的文件部分,得到根目录
PathCompactPath*根据像素值生成符合长度的路径
如原始路径: C:\path1\path2\sample.txt
根据120像素截断后为: C:\pat...\sample.txt
根据25像素截断后为: ...\sample.txt
PathCompactPathEx* 根据字符个数来生成符合长度的路径
PathSetDlgItemPath 将路径数据设置到对话框的子控件上
PathUndecorate 去除路径中的修饰
PathUnExpandEnvStrings 将路径中部分数据替换为系统环境变量格式
路径查找比较API
PathFindOnPath从路径中查找路径
PathFindExtension*查找路径的扩展名
PathFindFileName* 获取路径的文件名
PathFindNextComponent 查找匹配路径,除去盘符之外
PathFindSuffixArray查找给定的文件名是否有给定的后缀
PathGetArgs获取路径参数
PathGetCharType获取路径字符类型
PathGetDriveNumber根据逻辑盘符返回驱动器序号
路径转换API
PathRelativePathTo 创建一个路径到另一个路径的相对路径。
PathResolve将一个相对路径或绝对路径转换为一个合格的路径
PathCanonicalize 规范化路径,将格式比较乱的路径整理成规范的路径格式
PathBuildRoot 根据给定的磁盘序号创建根目录路径
CreateDirectory创建目录
GetShortPathName* 将长路径转为短路径格式
GetLongPathName*将短路径格式转为长路径
PathGetShortPath* 将长路径转为短路径格式(在后新版本Windows中不可用!)
PathCreateFromUrl 将URL路径转为MS-DOS格式
PathMakePretty*把路径全部转为小写,增加可读性
PathMakeSystemFolder 给路径增加系统属性
PathUnmakeSystemFolder去除路径中的系统属性
PathMakeUniqueName 从模板创建统一的路径格式
PathProcessCommand 生成一个可执行的路径这在ShellExecute中比较有用
路径验证API
PathCleanupSpec去除路径中不合法的字符
PathCommonPrefix 比较并提取两个路径相同的前缀
PathFileExists验证路径是否存在
PathMatchSpec 判断路径是否匹配制定的扩展名
PathIsDirectory判断路径是否是一个有效的目录
PathIsFileSpec 验证路径是否一个文件名(有可能是一个路径)
PathIsExe 验证路径是否是可执行文件。
PathIsRoot路径是否为根路径
PathIsRelative判断路径是否是相对路径
PathIsContentType 检测文件是否为制定类型。
PathIsContentType(“hello.txt” , “text/plain”) 返回TRUE
PathIsContentType(“hello.txt” , “image/gif”) 返回FALSE
PathIsHTMLFile判断路径是否是html文件类型——根据系统注册类型判断
PathIsLFNFileSpec 判断路径是否是长路径格式
PathIsNetworkPath 判断路径是否是一个网络路径。
PathIsPrefix判断路径是否含有指定前缀
PathIsSameRoot 判断路径是否有相同根目录
PathIsSlow 判断路径是否是一个高度延迟的网络连接
PathIsSystemFolder 判断路径是否有系统属性(属性可以自己设定)
PathIsUNC 路径是否是UNC格式(网络路径)
PathIsUNCServer 路径是否是UNC服务器
PathIsUNCServerShare 路径是否仅仅是UNC的共享路径格式
PathIsURL 路径是否是http格式
PathYetAnotherMakeUniqueName 基于已存在的文件,自动创建一个唯一的文件名。比如存在“新建文件”,此函数会创建文件名“新建文件(2)”
#include <windows.h>
#include <iostream>
#include <Shlwapi.h>
#include <shlobj.h>
#pragma comment(lib, "shlwapi.lib");
using namespace std;void main( void )
{
// PathRemoveArgs
char buffer_0[ ] = "c:\\a\\b\\FileA Arg1 Arg2";
char *lpStr0;
lpStr0 = buffer_0; cout << "Path before calling \"PathRemoveArgs\": " << lpStr0 << endl;
PathRemoveArgs(lpStr0);
cout << "Path before calling \"PathRemoveArgs\": " << lpStr0 << endl; // PathRemoveBackslash
char buffer_1[ ] = "c:\\a\\b\\File\\";
char *lpStr1;
lpStr1 = buffer_1; cout << "Path before calling \"PathRemoveBackslash\": " << lpStr1 << endl;
PathRemoveBackslash(lpStr1);
cout << "Path after calling \"PathRemoveBackslash\": " << lpStr1 << endl; // PathAddBackslash
char buffer_2[MAX_PATH] = "c:\\a\\b\\File";
char *lpStr2;
lpStr2 = buffer_2; cout << "Path before calling \"PathAddBackslash\": " << lpStr2 << endl;
PathAddBackslash(lpStr2);
cout << "Path after calling \"PathAddBackslash\": " << lpStr2 << endl; // PathRemoveBlanks
char buffer_3[ ] = " c:\\TEST\\File1\\File2 ";
char *lpStr3;
lpStr3 = buffer_3; cout << "Path before calling \"PathRemoveBlanks\": " << lpStr3 << endl;
PathRemoveBlanks(lpStr3);
cout << "Path after calling \"PathRemoveBlanks\": " << lpStr3 << endl; // PathAddExtension
char buffer_4[MAX_PATH] = "file";
char *lpStr4;
lpStr4 = buffer_4;
char *lpExt = ".txt"; cout << "Path before calling \"PathAddExtension\": " << lpStr4 << endl;
PathAddExtension(lpStr4, lpExt);
cout << "Path after calling \"PathAddExtension\": " << lpStr4 << endl; // PathRemoveExtension
char buffer_5[ ] = "C:\\TEST\\sample.txt";
char *lpStr5;
lpStr5 = buffer_5; cout << "Path before calling \"PathRemoveExtension\": " << lpStr5 << endl;
PathRemoveExtension(lpStr5);
cout << "Path after calling \"PathRemoveExtension\": " << lpStr5 << endl; // PathRenameExtension
char buffer_6[ ] = "C:\\TEST\\sample.txt";
char *lpStr6;
lpStr6 = buffer_6;
char *lpReExt = ".doc"; cout << "Path before calling \"PathRenameExtension\": " << lpStr6 << endl;
PathRenameExtension(lpStr6, lpReExt);
cout << "Path after calling \"PathRenameExtension\": " << lpStr6 << endl; // PathRemoveFileSpec
char buffer_7[ ] = "C:\\TEST\\sample.txt";
char *lpStr7;
lpStr7 = buffer_7; cout << "Path before calling \"PathRemoveFileSpec\": " << lpStr7 << endl;
PathRemoveFileSpec(lpStr7);
cout << "Path after calling \"PathRemoveFileSpec\": " << lpStr7 << endl; // PathUnquoteSpaces
char buffer_8[ ] = "\"C:\\path1\\path2\"";
char *lpStr8;
lpStr8 = buffer_8; cout << "Path before calling \"PathUnquoteSpaces\": " << lpStr8 << endl;
PathUnquoteSpaces(lpStr8);
cout << "Path after calling \"PathUnquoteSpaces\": " << lpStr8 << endl; // PathQuoteSpaces
char buffer_9[MAX_PATH] = "C:\\sample_one\\sample two";
char *lpStr9;
lpStr9 = buffer_9; cout << "Path before calling \"PathQuoteSpaces \": " << lpStr9 << endl;
PathQuoteSpaces (lpStr9);
cout << "Path after calling \"PathQuoteSpaces \": " << lpStr9 << endl; // PathAppend
/*
BOOL PathAppend(
LPTSTR pszPath,
LPCTSTR pszMore
);
*/ // PathCombine
/*
LPTSTR PathCombine(
LPTSTR lpszDest,
LPCTSTR lpszDir,
LPCTSTR lpszFile
);
*/ // PathStripPath
TCHAR szPath1[] = TEXT("c:\\dir1\\file.txt");
cout << "Path before calling \"PathQuoteSpaces \": " << szPath1 << endl;
PathStripPath(szPath1);
cout << "Path after calling \"PathQuoteSpaces \": " << szPath1 << endl; // PathCompactPath
char buffer_10[MAX_PATH] = "C:\\path1\\path2\\sample.txt";
char *lpStr10;
lpStr10 = buffer_10;
HDC hdc = GetDC(NULL); cout << "The un-truncated path is " << lpStr10 << endl;
PathCompactPath(hdc, lpStr10, );
cout << "The truncated path at 125 pixels is : " << lpStr10 << endl; // PathCompactPathEx
char buffer_dst[MAX_PATH] = "";
char *lpStrDst;
lpStrDst = buffer_dst; char buffer_Org[MAX_PATH] = "C:\\path1\\path2\\sample.txt";
char *lpStrOrg;
lpStrOrg = buffer_Org; cout << "Path before calling \"PathCompactPathEx \": " << lpStrOrg << endl;
PathCompactPathEx(lpStrDst, lpStrOrg, , );
cout << "Path after calling \"PathCompactPathEx \": " << lpStrDst << endl; // PathFindExtension
char buffer_Rev[MAX_PATH] = "";
char *lpStrRev;
lpStrRev = buffer_Rev; char buffer_11[] = "C:\\www.txt";
char *lpStr11;
lpStr11 = buffer_11; cout << "Path before calling \"PathFindExtension \": " << lpStr11 << endl;
lpStrRev = PathFindExtension(lpStr11);
cout << "Path after calling \"PathFindExtension \": " << lpStrRev << endl; // PathFindFileName
cout << "Path before calling \"PathFindFileName \": " << lpStr11 << endl;
lpStrRev = PathFindFileName(lpStr11);
cout << "Path after calling \"PathFindFileName \": " << lpStrRev << endl; // PathFindNextComponent
char buffer_12[ ] = "c:\\path1\\path2\\test";
char *lpStr12;
lpStr12 = buffer_12; cout << "Search a path for the next path component after the root " << lpStr1 << endl;
cout << "Return the next path component: \"" << PathFindNextComponent(lpStr1) << "\"" << endl; // PathFindSuffixArray (case-sensitive )
char* pszFilePath = "c:\\path1\\path2\\test.rtl";
LPCTSTR FILE_EXT_NAME[] = {".mp3", ".doc", ".rtl", ".ogg"};
const LPCTSTR* suffix_array = FILE_EXT_NAME;
int iArraySize = ;
LPCTSTR lpStrRevStr = PathFindSuffixArray(pszFilePath, suffix_array, iArraySize); cout << "Path before calling \"PathFindSuffixArray \": " << pszFilePath << endl;
cout << "Path after calling \"PathFindSuffixArray \": " << lpStrRevStr << endl; // GetLongPathName
// GetShortPathName
// PathGetShortPath() It might be altered or unavailable in subsequent versions of Windows. // PathMakePretty
char buffer_13[ ] = "C:\\TEST\\FILE";
char *lpStr13;
lpStr13 = buffer_13; char buffer_14[ ] = "c:\\test\\file";
char *lpStr14;
lpStr14 = buffer_14; cout << "The content of the unconverted path is : " << lpStr13 << endl;
cout << "The \"PathMakePretty\" function returns the value "
<< PathMakePretty(lpStr13) << " = TRUE & converts" << endl;
cout << "The content of the converted path is : " << lpStr13 << endl; cout << "The content of the unconverted path is : " << lpStr14 << endl;
cout << "The \"PathMakePretty\" function returns the value "
<< PathMakePretty(lpStr4) << " = FALSE & no conversion" << endl;
cout << "The content of the converted path is : " << lpStr14 << endl; // PathYetAnotherMakeUniqueName(Unicode String)
WCHAR* pszUniqueName = new WCHAR[MAX_PATH];
memset(pszUniqueName, , MAX_PATH);
WCHAR* pszPath = L"C:\\";
WCHAR* pszShort = NULL;
WCHAR* pszFileSpec = L"www.txt"; wcout << "Path before calling \"PathYetAnotherMakeUniqueName \": " << pszUniqueName << endl;
BOOL bRet = PathYetAnotherMakeUniqueName(pszUniqueName, pszPath, pszShort, pszFileSpec);
wcout << "Path after calling \"PathYetAnotherMakeUniqueName \": " << pszUniqueName << endl; if (pszUniqueName)
{
delete pszUniqueName;
pszUniqueName = NULL;
}
}
运行:
Path before calling "PathRemoveArgs": c:\a\b\FileA Arg1 Arg2
Path before calling "PathRemoveArgs": c:\a\b\FileA
Path before calling "PathRemoveBackslash": c:\a\b\File\
Path after calling "PathRemoveBackslash": c:\a\b\File
Path before calling "PathAddBackslash": c:\a\b\File
Path after calling "PathAddBackslash": c:\a\b\File\
Path before calling "PathRemoveBlanks": c:\TEST\File1\File2
Path after calling "PathRemoveBlanks": c:\TEST\File1\File2
Path before calling "PathAddExtension": file
Path after calling "PathAddExtension": file.txt
Path before calling "PathRemoveExtension": C:\TEST\sample.txt
Path after calling "PathRemoveExtension": C:\TEST\sample
Path before calling "PathRenameExtension": C:\TEST\sample.txt
Path after calling "PathRenameExtension": C:\TEST\sample.doc
Path before calling "PathRemoveFileSpec": C:\TEST\sample.txt
Path after calling "PathRemoveFileSpec": C:\TEST
Path before calling "PathUnquoteSpaces": "C:\path1\path2"
Path after calling "PathUnquoteSpaces": C:\path1\path2
Path before calling "PathQuoteSpaces ": C:\sample_one\sample two
Path after calling "PathQuoteSpaces ": "C:\sample_one\sample two"
Path before calling "PathQuoteSpaces ": c:\dir1\file.txt
Path after calling "PathQuoteSpaces ": file.txt
The un-truncated path is C:\path1\path2\sample.txt
The truncated path at 125 pixels is : C:\pa...\sample.txt
Path before calling "PathCompactPathEx ": C:\path1\path2\sample.txt
Path after calling "PathCompactPathEx ": ...\sa...
Path before calling "PathFindExtension ": C:\www.txt
Path after calling "PathFindExtension ": .txt
Path before calling "PathFindFileName ": C:\www.txt
Path after calling "PathFindFileName ": www.txt
Search a path for the next path component after the root c:\a\b\File
Return the next path component: "a\b\File"
Path before calling "PathFindSuffixArray ": c:\path1\path2\test.rtl
Path after calling "PathFindSuffixArray ": .rtl
The content of the unconverted path is : C:\TEST\FILE
The "PathMakePretty" function returns the value 1 = TRUE & converts
The content of the converted path is : C:\test\file
The content of the unconverted path is : c:\test\file
The "PathMakePretty" function returns the value 0 = FALSE & no conversion
The content of the converted path is : c:\test\file
Path before calling "PathYetAnotherMakeUniqueName ":
Path after calling "PathYetAnotherMakeUniqueName ": C:\www (2).txt
请按任意键继续. . .







