如何从GetModuleFileName返回的路径中提取仅含文件名的模块名
我使用
GetModuleFileName函数获取到了模块的完整路径与名称,例如返回的路径为C:\Users\user\Desktop\file.exe,请问如何仅提取其中的file.exe模块名,去掉前面的完整路径部分?
提取方案
方案1:Windows原生API实现(最便捷)
Windows的Shell库提供了现成的PathFindFileName API,可以直接从完整路径中提取文件名,无需手动处理字符串:
- 依赖项:需要引入头文件
shlwapi.h,链接shlwapi.lib库 - 代码示例:
#include <windows.h> #include <shlwapi.h> #pragma comment(lib, "shlwapi.lib") int main() { TCHAR szFullPath[MAX_PATH] = {0}; // 获取当前模块的完整路径 GetModuleFileName(NULL, szFullPath, MAX_PATH); // 直接提取文件名 LPTSTR pszFileName = PathFindFileName(szFullPath); // pszFileName 此时指向的就是 file.exe 的起始地址 return 0; }
该函数自动兼容ANSI和Unicode编码,不需要额外处理字符集问题。
方案2:无依赖手动实现
如果你不想引入额外的Shell库依赖,可以手动查找路径中最后一个反斜杠的位置,向后偏移一位就是文件名的起始位置:
- 代码示例:
#include <windows.h> #include <tchar.h> LPTSTR ExtractFileName(LPTSTR szFullPath) { // 查找最后一个反斜杠的位置 LPTSTR pLastSlash = _tcsrchr(szFullPath, _T('\\')); // 没有找到反斜杠说明传入的本身就是文件名 return pLastSlash ? (pLastSlash + 1) : szFullPath; } int main() { TCHAR szFullPath[MAX_PATH] = {0}; GetModuleFileName(NULL, szFullPath, MAX_PATH); LPTSTR pszFileName = ExtractFileName(szFullPath); return 0; }
GetModuleFileName返回的路径格式规范,不会出现末尾带反斜杠的情况,以上逻辑可以直接使用。
其他语言快速实现
如果是上层语言调用GetModuleFileName后需要提取文件名,可以直接使用语言自带的路径处理工具:
- C#:使用
System.IO.Path.GetFileName()方法
string fullPath = @"C:\Users\user\Desktop\file.exe"; string fileName = Path.GetFileName(fullPath);
- Python:使用
os.path.basename()方法
import os full_path = r"C:\Users\user\Desktop\file.exe" file_name = os.path.basename(full_path)
内容的提问来源于stack exchange,提问作者JeduMiSePalacinke
相关产品推荐
相关产品推荐

