张浩扬穿JK 2022-12-11 11:24 采纳率: 28.6%
浏览 15

C语言如何获取进程自身所在目录(不是工作目录)

假设条件

假设我有如下文件

C:\folder\file.dat

我的代码

#include <stdio.h>
int main(void)
{
    FILE *f = fopen("file.dat", "rb");
    if (f == NULL)
    {
        puts("ERROR: Cannot open the file");
        return -1;
    }
    puts("File reader is OK");
    return 0;
}

遇到的问题

我将上面的代码编译成这个程序:

C:\folder\filereader.exe

fopen() 函数是以进程的工作目录为相对路径进行文件的读写,而不是进程自身的目录。

  • 若我在终端中将工作目录设置为 "C:\folder" ,运行filereader,可以成功访问该文件,并打印"File reader is OK"。
  • 若我换一个工作目录(比如 "C:\folder2"),运行..\folder\filereader后,fopen() 函数无法访问该文件,并打印"ERROR: Cannot open the file",因为程序试图从 "C:\folder2" 目录下搜索 "file.dat",但是搜索不到。

期望的运行结果

无论我从哪里启动这个程序,都可以以程序自身所在的目录作为相对路径访问到文件。

寻求帮助

我在做跨平台开发,所以不希望调用Windows API,尽量使用C标准库或者一些开源的库来实现此功能。
大家可能会想到 getcwd() 函数,但是它获取的是工作目录,而不是进程自身的目录。

  • 写回答

1条回答 默认 最新

  • 真相重于对错 2022-12-11 11:55
    关注

    call api

    DWORD WINAPI GetModuleFileName(
        _In_opt_  HMODULE hModule,
        _Out_     LPTSTR lpFilename,
        _In_      DWORD nSize
    );
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 12月11日

悬赏问题

  • ¥20 数学建模,尽量用matlab回答,论文格式
  • ¥15 昨天挂载了一下u盘,然后拔了
  • ¥30 win from 窗口最大最小化,控件放大缩小,闪烁问题
  • ¥20 易康econgnition精度验证
  • ¥15 msix packaging tool打包问题
  • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能