四时宝库

程序员的知识宝库

c++ 杂项(2) 获取程序路径(c++获取程序执行时间)

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中。

以下是对代码的详细解释:

  1. 头文件包含
* `#include <stdint.h>`:包含标准整数类型的定义。
* `#include <string>`:包含字符串处理的类和函数。
* `#ifdef _WIN32` 和 `#else`:条件编译,用于判断是否在Windows环境下编译。
    + `#include <windows.h>`:Windows特有的头文件,包含许多与Windows系统相关的函数和宏。
    + `#include <time.h>` 和 `#include <unistd.h>`:Linux特有的头文件,包含时间处理和POSIX标准的函数和宏。
  1. 类定义
* `class XXTool`:定义了一个名为`XXTool`的类。
  1. 成员函数
* `static bool GetSelfPath(std::string& path)`:定义了一个静态成员函数,用于获取当前程序的路径。该函数返回一个布尔值,表示操作是否成功。参数`path`是一个引用,用于存储获取到的路径。
  1. 函数实现
* `char tmp[4096] = { 0 }`:定义了一个字符数组`tmp`,用于临时存储获取到的路径。
* `#ifdef _WIN32` 和 `#else`:条件编译,根据不同的操作系统选择不同的方法来获取程序路径。
    + 在Windows下,使用`GetModuleFileNameA`函数来获取程序路径。该函数的第一个参数是模块句柄,这里传入`NULL`表示获取当前进程的模块。第二个参数是存储路径的字符数组,第三个参数是数组的大小。如果获取失败,返回值小于0。
    + 在Linux下,使用`readlink`函数来获取程序路径。这里读取的是`/proc/self/exe`的符号链接,它指向当前进程的可执行文件。如果获取失败,返回值小于0。
* `path = tmp`:将获取到的程序路径存储到传入的字符串参数`path`中。
  1. 返回值
* 如果成功获取到程序路径,函数返回`true`;否则返回`false`。



发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接