路径操作工具(C语言)
pathTool.h
1、GetCurrentPath():获取当前程序所在路径(绝对路径+程序名)
2、GetProgramName():获取当前程序名
3、GetCurrentFolderPath:获取当前程序相对路径(绝对路径+不包含程序名)
/*
时间:2020-2-12 ->修复了获取当前路径偶尔出现的BUG,原因是GetProgramName函数中有内存没有初始化
*/
#define uint unsigned int
#include<cstring>
// 获取字符串实际字符长度
uint GetStringLength(char *str)
{
uint length = 0;
while(str[length] != '\0')length++;
return length; //返回字符串的有效字符长度
}
// 获取当前程序所在路径(绝对路径)
char * GetCurrentPath()
{
char *buffer = (char *)malloc(sizeof(char) * MAX_PATH);
GetModuleFileName(NULL,buffer,MAX_PATH);//该函数获取本程序路径
return buffer;
//char * path = GetCurrentPath(); //接收后
//free(path); //记得释放内存
}
//获取当前程序名
char *GetProgramName()
{
//先获取绝对路径,然后检测数组大小,然后根据数组大小反向遍历知道遇到“\\”为止
char *Path = GetCurrentPath();
//计算路径总字符数,Path[charCount-1] //是路径程序全名的倒数第一个字符
int charCount = GetStringLength(Path);//这个最终是个数,访问则需要下标(个数-1)
//检测EXE文件名长度
int nameLength = 0; //保存的是实际长度
for(int i = 1;;i++)
{
if(Path[charCount-i] != '\\')
nameLength++;
else
break;
}
//获取文件名
char *pName = (char *)malloc(sizeof(char) * (nameLength+1));
memset(pName, 0, nameLength+1);
for(int i = 1; i <= nameLength;i++){
pName[nameLength-i] = Path[charCount-i];
}
free(Path);
return pName;
//free(pName);
}
// 获取当前程序相对路径(不包含程序名)
char *GetCurrentFolderPath()
{
//获取路径总字符数[重要]
char *Path = GetCurrentPath();
int pathCount = 0;
for(int i = 0;;i++) {
if(Path[i] != '\0')
pathCount++; //这个最终是个数,访问则需要下标(个数-1)
else
break;
}
//获取程序名长度
char *ProgramName = GetProgramName();
int nameCount = 0;
for(int i = 0;;i++) {
if(ProgramName[i] != '\0')
nameCount++; //这个最终是个数,访问则需要下标(个数-1)
else
break;
}
int arrLength = pathCount - nameCount;//新路径长度
char *currentPath = (char *)malloc(sizeof(char) * (arrLength+1));
memset(currentPath, 0, (arrLength+1));//先初始化此数组,防止有垃圾值
//获得相对路径
for(int i = 1; i <= arrLength; i++){
currentPath[arrLength-i] = Path[arrLength-i];
}
free(ProgramName);
//free(currentPath);//外部释放内存
return currentPath;
}
//相关请参考博客:https://www.cnblogs.com/rainbow70626/p/8818791.html
备注:在之前有一个函数,可以直接获取当前程序路径,但是这个函数其实是“有问题”的!代码:
/
【有问题】(2019年9月10日09:36:40)
问题:在程序设置开机启动项后,该函数获取程序当前工作路径是:C:\Window\system32
而不是程序实际所在的路径。(可能是因为控制台程序本就由C:\Window\System32下的某个程序启动)
【解决方案】
经过测试,获取程序的绝对路径时,不会出现这种情况,但是要去掉去程序名。
/
//功能:获取当前路径(有问题)
char * GetCurrentFolderPath()
{
char *buffer = (char *)malloc(sizeof(char) * MAX_PATH);
GetCurrentDirectory(MAX_PATH,buffer);
return buffer;
}