c++ 杂项(2) 获取程序路径
获取程序所在路径,这个基本上是刚需,下面给出简单的示例
1、windows
在 Windows 下,可以使用 GetModuleFileName 函数来获取程序所在路径。
DWORD GetModuleFileNameA(
[in, optional] HMODULE hModule,
[out] LPSTR lpFilename,
[in] DWORD nSize
);
以下是使用该函数获取程序所在路径的示例代码:
#include <windows.h>
#include <iostream>
int main() {
char modulePath[MAX_PATH];
GetModuleFileNameA(NULL, modulePath, MAX_PATH);
std::cout << "程序所在路径:" << modulePath << std::endl;
return 0;
}
在上述代码中,GetModuleFileName 函数的第一个参数为 NULL,表示获取当前进程的模块文件名。第二个参数为指向字符数组的指针,用于存储获取到的模块文件名。第三个参数为字符数组的大小。
运行程序后,将在控制台输出程序所在路径。
2、linux
在Linux 下, 可以使用 readlink 函数来获取程序所在路径。
ssize_t readlink(const char *restrict pathname, char *restrict buf, size_t bufsiz);
下面是一个使用 readlink 函数的示例代码:
#include <unistd.h>
#include <iostream>
int main() {
char linkPath[1024];
ssize_t linkLen = readlink("/proc/self/exe", linkPath, sizeof(linkPath) - 1);
// "/proc/self/exe" 其实就是进程 /proc/进程号/exe
if (linkLen == -1) {
std::cout << "无法获取程序所在路径" << std::endl;
return 1;
}
linkPath[linkLen] = '\0'; //注意要设置结束符, 或 char linkPath[1024] = {0};
std::cout << "程序所在路径:" << linkPath << std::endl;
return 0;
}
在上述代码中,我们直接将 readlink 函数的返回值作为程序所在路径输出。
3、结合下, 以工具类封装
#ifndef __XX_TOOL_H__
#define __XX_TOOL_H__
#include <stdint.h>
#include <string>
#ifdef _WIN32
#include <windows.h>
#else
#include <time.h>
#include <unistd.h>
#endif
class XXTool {
public:
//获取程序路径
static bool GetSelfPath(std::string& path) {
char tmp[4096] = { 0 };
#ifdef _WIN32
if (0 >= GetModuleFileNameA(NULL, tmp, 4096)) {
return false;
}
#else
if (0 >= readlink("/proc/self/exe", tmp, 4096)) {
return false;
}
#endif
path = tmp;
return true;
}
//注意: 字符编码问题, windows下返回的是ansi, linux下返回的是utf8
//没有达到工业强度,应该统一处理成utf8,再输出.
//windows下路径也应该转化成linux形式: c:\abc\a.exe => c:/abc/a.exe
//系统运行时间
static int64_t GetTickCount() {
#ifdef _WIN32
return ::GetTickCount64();
#else
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return (int64_t)(ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
#endif
}
};
#endif
惯例, 文心一言解析如下:
这段代码定义了一个名为XXTool的类,其中包含一个静态成员函数GetSelfPath,该函数用于获取当前程序的路径。具体来说,这个函数的作用是将当前程序的完整路径存储在传入的std::string参数path中。
以下是对代码的详细解释:
- 头文件包含:
* `#include <stdint.h>`:包含标准整数类型的定义。
* `#include <string>`:包含字符串处理的类和函数。
* `#ifdef _WIN32` 和 `#else`:条件编译,用于判断是否在Windows环境下编译。
+ `#include <windows.h>`:Windows特有的头文件,包含许多与Windows系统相关的函数和宏。
+ `#include <time.h>` 和 `#include <unistd.h>`:Linux特有的头文件,包含时间处理和POSIX标准的函数和宏。
- 类定义:
* `class XXTool`:定义了一个名为`XXTool`的类。
- 成员函数:
* `static bool GetSelfPath(std::string& path)`:定义了一个静态成员函数,用于获取当前程序的路径。该函数返回一个布尔值,表示操作是否成功。参数`path`是一个引用,用于存储获取到的路径。
- 函数实现:
* `char tmp[4096] = { 0 }`:定义了一个字符数组`tmp`,用于临时存储获取到的路径。
* `#ifdef _WIN32` 和 `#else`:条件编译,根据不同的操作系统选择不同的方法来获取程序路径。
+ 在Windows下,使用`GetModuleFileNameA`函数来获取程序路径。该函数的第一个参数是模块句柄,这里传入`NULL`表示获取当前进程的模块。第二个参数是存储路径的字符数组,第三个参数是数组的大小。如果获取失败,返回值小于0。
+ 在Linux下,使用`readlink`函数来获取程序路径。这里读取的是`/proc/self/exe`的符号链接,它指向当前进程的可执行文件。如果获取失败,返回值小于0。
* `path = tmp`:将获取到的程序路径存储到传入的字符串参数`path`中。
- 返回值:
* 如果成功获取到程序路径,函数返回`true`;否则返回`false`。