Windows API关于文件路径的处理函数

文件路径处理的相关函数

相关函数在头文件<Shlwapi.h>中,需要#pragma comment(lib, “shlwapi.lib”)

获取当前运行的exe程序的位置

char filePath[MAX_PATH] = {0};
::GetModuleFileName(nullptr, filePath, MAX_PATH);

获取当前运行的dll位置

extern CDialogApp theApp;
char filePath[MAX_PATH] = {0};
::GetModuleFileName(theApp.m_hInstance, filePath, MAX_PATH);

去除文件名,得到目录

char filePath[MAX_PATH] = {0};
::GetModuleFileName(nullptr, filePath, MAX_PATH);
//C:\\usr\\WorkSpace\\Test\\a.exe  ==> C:\\usr\\WorkSpace\\Test
::PathRemoveFileSpec(filePath);

 在文件路径后面添加或者删除 \

char filePath[MAX_PATH] = {0};
::GetModuleFileName(nullptr, filePath, MAX_PATH);
// C:\\usr\\WorkSpace\\Test\\a.exe  ==> C:\\usr\\WorkSpace\\Test
::PathRemoveFileSpec(filePath);

// C:\\usr\\WorkSpace\\Test  ==> C:\\usr\\WorkSpace\\Test\\ 
::PathAddBackslash(exePath);

// C:\\usr\\WorkSpace\\Test\\ ==> C:\\usr\\WorkSpace\\Test
::PathRemoveBackslash(exePath);

去除目录部分,得到文件名

char filePath[MAX_PATH] = {0};
::GetModuleFileName(nullptr, filePath, MAX_PATH);
// C:\\usr\\WorkSpace\\Test\\a.exe  ==> a.exe
::PathStripPath(exePath);

 去掉路径的文件部分,得到根目录。

char filePath[MAX_PATH] = {0};
::GetModuleFileName(nullptr, filePath, MAX_PATH);
// C:\\usr\\WorkSpace\\Test\\a.exe  ==> C:\\ 
::PathStripToRoot(exePath);

去掉路径中的空格  

char filePath[MAX_PATH] = {0};
::GetModuleFileName(nullptr, filePath, MAX_PATH);
::PathUnquoteSpaces(filePath);
::PathRemoveBlanks(filePath);

一些其他函数

#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, 125);
    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, 10, 0);
    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 = 4;
    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, 0, 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
请按任意键继续. . .
    //去除路径的参数
    PathRemoveArgs
    //去除路径最后的反斜杠”\”
    PathRemoveBackslash
    //在路径最后加上反斜杠”\”
    PathAddBackslash
    //去除路径前后的空格
    PathRemoveBlanks
    //在文件路径后面加上扩展名
    PathAddExtension
    //去除文件路径扩展名
    PathRemoveExtension
    //更改文件路径扩展名
    PathRenameExtension
    //去除文件名,得到目录
    PathRemoveFileSpec
    //去除路径中的首尾空格
    PathUnquoteSpaces
    //判断路径中是否有空格,有的话,就是用”“引号把整个路径包含起来
    PathQuoteSpaces
    //将一个路径追加到另一个路径后面
    PathAppend
    //合并两个路径
    PathCombine
    //去掉路径中的磁盘符或UNC部分
    PathSkipRoot
    //去掉路径中的目录部分,得到文件名
    PathStripPath
    //去掉路径的文件部分,得到根目录
    PathStripToRoot
    //根据像素值生成符合长度的路径
    PathCompactPath
    //如原始路径: C:\path1\path2\sample.txt
    //根据120像素截断后为: C:\pat…\sample.txt
    //根据25像素截断后为: …\sample.txt
    //根据字符个数来生成符合长度的路径
    PathCompactPathEx
    //将路径数据设置到对话框的子控件上
    PathSetDlgItemPath
    //去除路径中的修饰
    PathUndecorate
    //将路径中部分数据替换为系统环境变量格式
    PathUnExpandEnvStrings
    //从路径中查找路径
    PathFindOnPath
    //查找路径的扩展名
    PathFindExtension
    //获取路径的文件名
    PathFindFileName
    //查找匹配路径
    PathFindNextComponent
    //查找给定的文件名是否有给定的后缀
    PathFindSuffixArray
    //获取路径参数
    PathGetArgs
    //获取路径字符类型
    PathGetCharType
    //根据逻辑盘符返回驱动器序号
    PathGetDriveNumber
    //创建一个路径到另一个路径的相对路径。
    PathRelativePathTo
    //将一个相对路径或绝对路径转换为一个合格的路径
    PathResolve
    //规范化路径。将格式比较乱的路径整理成规范的路径格式
    PathCanonicalize
    //根据给定的磁盘序号创建根目录路径
    PathBuildRoot
    //创建目录
    CreateDirectory
    //将长路径转为8.3格式的短路径格式
    GetShortPathName
    //将短路径格式转为长路径。
    GetLongPathName
    //将长路径转为短路径格式(8.3格式)
    PathGetShortPath
    //将URL路径转为MS-DOS格式
    PathCreateFromUrl
    //把路径全部转为小写,增加可读性
    PathMakePretty
    //给路径增加系统属性
    PathMakeSystemFolder
    //去除路径中的系统属性
    PathUnmakeSystemFolder
    //从模板创建统一的路径格式
    PathMakeUniqueName
    //生成一个可执行的路径,比如有参数的,会自动将路径用”“包含
    PathProcessCommand
    //去除路径中不合法的字符
    PathCleanupSpec
    //比较并提取两个路径相同的前缀
    PathCommonPrefix
    //验证路径是否存在
    PathFileExists
    //判断路径是否匹配制定的扩展名
    PathMatchSpec
    //判断路径是否是一个有效的目录
    PathIsDirectory
    //验证路径是否一个文件名(有可能是一个路径)
    PathIsFileSpec
    //验证路径是否是可执行文件
    PathIsExe
    //注意:不仅仅是.exe,还有.bat、.com、.src等
    //路径是否为根路径
    PathIsRoot
    //判断路径是否是相对路径
    PathIsRelative
    //检测文件是否为制定类型
    PathIsContentType
    //例如:
    PathIsContentType(“hello.txt”,”text/plain”) 返回TRUE
    PathIsContentType(“hello.txt”,”image/gif”) 返回FALSE

    //判断路径是否是html文件类型——根据系统注册类型判断
    PathIsHTMLFile
    //判断路径是否是长路径格式
    PathIsLFNFileSpec
    //判断路径是否是一个网络路径。
    PathIsNetworkPath
    //判断路径是否含有指定前缀
    PathIsPrefix
    //判断路径是否有相同根目录
    PathIsSameRoot
    //判断路径是否是一个高度延迟的网络连接
    PathIsSlow
    //判断路径是否有系统属性(属性可以自己设定)
    PathIsSystemFolder
    //路径是否是UNC格式(网络路径)
    PathIsUNC
    //路径是否是UNC服务器
    PathIsUNCServer
    //路径是否仅仅是UNC的共享路径格式
    PathIsUNCServerShare
    //路径是否是http格式。
    PathIsURL
    //基于已存在的文件,自动创建一个唯一的文件名。比如存在”新建文件”,此函数会创建文件名”新建文件(2)”
    PathYetAnotherMakeUniqueName 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt中使用Windows API函数CreateProcess启动msu文件的步骤如下: 1. 在Qt项目中包含Windows.h头文件。 ```c++ #include <Windows.h> ``` 2. 定义CreateProcess函数需要的参数,包括待启动的msu文件路径和命令行参数。 ```c++ LPTSTR applicationName = L"C:\\Windows\\System32\\wusa.exe"; // msu文件启动程序路径 LPTSTR commandLine = L"C:\\temp\\update.msu /quiet /norestart"; // msu文件路径和命令行参数 LPSECURITY_ATTRIBUTES processAttributes = NULL; LPSECURITY_ATTRIBUTES threadAttributes = NULL; BOOL inheritHandles = FALSE; DWORD creationFlags = 0; LPVOID environment = NULL; LPTSTR currentDirectory = NULL; LPSTARTUPINFO startupInfo = new STARTUPINFO; LPPROCESS_INFORMATION processInformation = new PROCESS_INFORMATION; ZeroMemory(startupInfo, sizeof(STARTUPINFO)); ZeroMemory(processInformation, sizeof(PROCESS_INFORMATION)); startupInfo->cb = sizeof(STARTUPINFO); ``` 3. 调用CreateProcess函数启动msu文件。 ```c++ BOOL success = CreateProcess(applicationName, commandLine, processAttributes, threadAttributes, inheritHandles, creationFlags, environment, currentDirectory, startupInfo, processInformation); if (success) { qDebug() << "Process started"; } else { qDebug() << "Process failed to start"; } ``` 完整代码如下: ```c++ #include <QCoreApplication> #include <QDebug> #include <Windows.h> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // Define CreateProcess parameters LPTSTR applicationName = L"C:\\Windows\\System32\\wusa.exe"; // msu file launch program path LPTSTR commandLine = L"C:\\temp\\update.msu /quiet /norestart"; // msu file path and command line parameters LPSECURITY_ATTRIBUTES processAttributes = NULL; LPSECURITY_ATTRIBUTES threadAttributes = NULL; BOOL inheritHandles = FALSE; DWORD creationFlags = 0; LPVOID environment = NULL; LPTSTR currentDirectory = NULL; LPSTARTUPINFO startupInfo = new STARTUPINFO; LPPROCESS_INFORMATION processInformation = new PROCESS_INFORMATION; ZeroMemory(startupInfo, sizeof(STARTUPINFO)); ZeroMemory(processInformation, sizeof(PROCESS_INFORMATION)); startupInfo->cb = sizeof(STARTUPINFO); // Start process BOOL success = CreateProcess(applicationName, commandLine, processAttributes, threadAttributes, inheritHandles, creationFlags, environment, currentDirectory, startupInfo, processInformation); if (success) { qDebug() << "Process started"; } else { qDebug() << "Process failed to start"; } // Cleanup delete startupInfo; CloseHandle(processInformation->hProcess); CloseHandle(processInformation->hThread); delete processInformation; return a.exec(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值