C/C++ getcwd 获取项目的运行路径

c++\c 中 getcwd()函数:取得当前的工作目录(working directory) 用 c/c++ 获取当前工作目录的方法:getcwd 首先我们来看一下该函数的声明: #include<unistd.h> char* getcwd(char* buffer, size_t size); 用法介绍: 参数说明:getcwd 方法会将当前工作目录(working directory)的绝对路径复制到参数 buffer 所指的内存空间中,而参数 size 是 buffer 所指的空间大小。 第一种用法: 基于上面的解析我们很容易得到第... 阅读详情
AI摘要

本文介绍了在Windows和Linux环境下,使用getcwd和_getcwd函数获取程序运行路径的不同行为,并提供了解决方案。在Windows下,VS运行项目返回项目路径,直接运行.exe返回程序路径;而在Linux中始终返回可执行程序路径。此外,还提到了Windows API GetModuleFileNameA能直接获取运行路径,以及在Linux中通过读取/proc/self/exe的符号链接获取绝对路径。

在Linux下做QT项目时,需要获取项目的运行路径,于是用getcwd函数进行获取,然后在Windows下进行测试,发现获取到的是程序的项目路径,即代码文件路径,然后再Linux QT中测试,获取到的又是运行路径,这就很纳闷了。经过再三测试,终于发现了原因!


一、

头文件:
在unix下是unistd.h,VS下是direct.h

代码:

#include <stdio.h>
#include <string>

// 区分此函数是在Windows环境调用还是Linux环境调用
#if defined (_WIN64) || defined (WIN32) || defined (_WIN32)

//printf("---Windows---\n");
#include <direct.h>

#else

//printf("---Linux---\n");
#include <unistd.h>

#endif



/******************************************************************************
 *
 * 功能:
 *		获得当前程序的工作路径(绝对路径),即运行路径!
 *
 * 注意:
 *		头文件在unix下是unistd.h,VS下是direct.h,应该依编程者的环境而定.
 *		这里解释一下运行路径,即是程序开始运行的路径,例如:
 *			1.如果是在Windows环境的VS编译器中运行项目,则返回的是项目路径,
 *			  即代码文件路径(.h和.cpp路径),因为是在编译器中运行的项目,所以
 *			  程序的运行路径也是才项目路径中开始运行的。
 *			2.如果是在Windows环境,运行已经编译好的.exe程序,则返回的是当前
 *			  .exe程序所在的路径,因为是在当前路径所运行的!
 *			3.在Linux环境,返回的都是可执行程序的路径!
 *
 * 参数:
 *		无.
 *
 * 返回值:
 *		成功返回程序的工作路径(绝对路径);失败返回空串
 *
 ******************************************************************************/
std::string getOperationFilePath() {

	char *buffer = NULL;

	// 区分此函数是在Windows环境调用还是Linux环境调用
#if defined (_WIN64) || defined (WIN32) || defined (_WIN32)

	// 获取项目的工作路径
	buffer = _getcwd(NULL, 0);

#else

	// 获取项目的工作路径
	buffer = getcwd(NULL, 0);

#endif

	if (buffer) {
		std::string path = buffer;
		free(buffer);
		return path ;
	}

	return "";
}

测试运行:

int main(void) {

	printf("getOperationFilePath = %s\n", getOperationFilePath().c_str());

	system("pause");
	return 0;
}
  1. 在VS中运行截图:
    在这里插入图片描述

  2. 直接运行.exe截图:
    在这里插入图片描述

解释上面提到的问题:
这里解释一下运行路径,即是程序开始运行的路径,例如:

  1. 如果是在Windows环境的VS编译器中运行项目,则返回的是项目路径,
    即代码文件路径(.h和.cpp路径),因为是在编译器中运行的项目,所以
    程序的运行路径也是才项目路径中开始运行的。
  2. 如果是在Windows环境,运行已经编译好的.exe程序,则返回的是当前
    .exe程序所在的路径,因为是在当前路径所运行的!
  3. 在Linux环境,返回的都是可执行程序的路径!

二、

Windows有一个api可以直接获得项目的运行路径,不用区分是在项目中运行还是.exe运行!

头文件:
#include < Windows.h >

#include <Windows.h>

int main(void) {

	char path[1024] = { 0 };
	GetModuleFileNameA(NULL, path, MAX_PATH);		// 获取到完整路径,如:E:\Tools\qq.exe
	*strrchr(path, '\\') = '\0';					// 截取路径,如:E:\Tools

	printf("paht = %s\n", path);

	system("pause");
	return 0;
}

运行截图:
在这里插入图片描述

如果把代码:*strrchr(path, ‘\’) = ‘\0’; // 截取路径,如:E:\Tools
注释掉,则可以获得全路径:
在这里插入图片描述


三、

如果第一种方式没法正确获取的话,可以尝试使用此种方式:

头文件: #include < unistd.h >

linux系统中有个符号链接:/proc/self/exe它代表当前程序,可以用readlink读取它的源路径就可以获取当前程序的绝对路径了。

std::string getOperationFilePath() {
    char buf[256] = { 0 };

    int ret = readlink("/proc/self/exe", buf, 256);
    if (ret < 0) {
        printf("%d: readlink error:%s", __LINE__, strerror(errno));
        return "";
    }

    *strrchr(buf, '/') = '\0';      // 去掉可执行程序名  /tmp/test/a.exe    ==>     /tmp/test

    return buf;
}

总结:
这也是一个小小的细节问题,也有点小坑,今天这个坑我踩过,下次就不会再踩了。
也希望可以帮助看到这篇博客的朋友,跳过此坑!

C/C++ getcwd 跨平台获取程序运行路径的陷阱与实战 本文深入探讨了C/C++中getcwd函数在跨平台获取程序运行路径时的陷阱与解决方案。通过分析Linux和Windows平台下的差异,提供了多种可靠的路径获取方法,包括Windows API、Linux的/proc文件系统以及现代C++的filesystem库。文章还分享了跨平台开发的最佳实践和常见问题排查技巧,帮助开发者避免路径处理中的常见错误。 阅读详情

相关推荐

别再踩坑了!C/C++跨平台获取程序运行路径,用getcwd还是GetModuleFileName?

本文深入探讨了C/C++跨平台获取程序运行路径的常见问题与解决方案,对比分析了getcwd和GetModuleFileName在不同平台下的行为差异。通过详细的代码示例和原理剖析,帮助开发者避免常见陷阱,实现可靠的路径获取功能,提升跨平台应用的稳定性与兼容性。

weixin_30588675的博客 655

C++文件操作-获取当前工作路径的方法

1.采用GetCurrentDirectory,用于获取当前进程的当前目录 2.getcwd获取当前工作目录,类似上一方法 #include  &lt;direct.h&gt;   #include  &lt;stdio.h&gt;    char   buffer[MAX_PATH];    getcwd(buffer, MAX_PATH);  3.采用GetModuleFileName,用...

屁屁屁喏漕 6347

C++ 返回当前EXE所在的绝对路径和文件夹路径

在代码里打印当前EXE所在的绝对路径和文件夹路径,以便调用该可执行程序时我可以知道当前执行程序的路径,以方便后续我使用别的文件夹和文件。

weixin_43896283的博客 983

C++ - 获取程序路径

C++ - 获取程序路径的示例代码。

莫忘输赢的博客 2716

图文实录|大规模预训练模型:探讨与展望

第二期「澜舟分享会」我们邀请到来自复旦大学计算机学院邱锡鹏教授分享了“大规模预训练模型:探讨与展望”,本此演讲主要围绕大规模预训练语言模型展开讨论,并探讨大模型成功的原因、适用场景、未来发展方向以及身处大模型时代我们的机遇。

langboat_mengzi的博客 1204

R语言灰色关联分析法

输入数据并用DT包的datatable函数展示数据 ABDDEF分别对应第1到第6个供应商产品质量、技术水平、供应能力、经济效益、交货情况、市场影响度指标属于效益型指 产品价格、地理位置、售后服务指标属于成本型指标。现分别对上述指标进行规范化: 对于效益型指标(正项指标)标准化公式为: x∗=x−min(x)max(x)−min(x) x^{\ast}=\frac{x-min\left( x \right)}{max\left( x \right) -min\left( x \right)} x∗=max

qq_54423921的博客 7995

c++_获取程序运行的目录

【代码】c++_获取程序运行的目录。

9分钟带帽 2317

【自动驾驶学习笔记——Prescan和Simulink 学习笔记和问题记录(1)】

主要记录一些Prescan/Simulink 联合仿真出现的问题。

ly1336545868的博客 1464

别再被getcwd坑了!跨平台C/C++项目获取运行路径的3种实战方案(Windows/Linux/VS/QT)

本文深入探讨了C/C++跨平台项目中获取运行路径的3种实战方案,对比分析了getcwd在不同平台下的局限性,并提供了Windows的GetModuleFileName、Linux的/proc/self/exe以及跨平台条件编译的解决方案,帮助开发者避免路径解析的常见陷阱。

weixin_42571444的博客 247

Springboot项目中使用邮箱验证码注册登录的代码实现

本文介绍了在Spring Boot应用中实现邮箱验证码注册和登录功能的完整方案。文章首先概述了三种用户认证方式(邮箱验证码注册/登录和传统密码登录),然后详细说明了实现所需的技术栈(Spring Boot、Spring Security、JWT等)。重点阐述了邮件服务配置、验证码生成与存储的核心实现,包括QQ邮箱授权码获取、Thymeleaf邮件模板处理以及验证码缓存管理。最后展示了发送验证码和用户注册的API实现,为开发者提供了完整的参考方案。该方案兼顾安全性和用户体验,适合现代Web应用的用户认证需求。

BXCQ_xuan的技术专栏 | 实战干货·实践教程·学习笔记 1338

手把手教你用QEMU虚拟化华为路由器固件(附完整网络配置指南)

本文提供了一份详尽的QEMU虚拟化华为路由器固件的实战指南。从固件解包、网络桥接配置到QEMU虚拟机启动,手把手教你搭建完整的嵌入式设备沙箱环境,特别适合安全研究、逆向分析和学习嵌入式系统工作原理。

tgb3456789的博客 937

C++ 获取当前路径

在C++ 中可以通过 _getcwd函数来获取当前文件所在文件夹的路径, 其函数原型为: char * _cdecl _getcwd(char *_DstBuf,int _SizeInBytes) /* 头文件: <direct.h> 参数:_DstBuf:指向当前路径字符串的字符指针,getcwd函数会将当前路径复制到其指向的内存空间 参数:_SizeInBytes:存储该路径字符串的内存空间的长度,_DstBuf指向的内存空间的长度 返回值:指向路径字符串内存空间的指针 说明:

weixin_43214117的博客 1万+

微信删除的聊天记录怎么恢复(2024年最新攻略合集)

随着微信对我们生活中方方面面的渗透,微信已然从一款简单的社交软件过渡成为现时代的一种生活方式,而微信中的聊天记录就是我们和朋友之间历程的最好证明。对此,今天我们来聊聊微信删除的聊天记录怎么恢复的问题。

m0_70960708的博客 944

C\C++ 获取当前路径

获取当前工作目录是使用函数:getcwd。cwd指的是“current working directory”,这样就好记忆了。 函数说明:     函数原型:char* getcwd(char* buffer, int len);     参数:buffer是指将当前工作目录的绝对路径copy到buffer所指的内存空间, len是buffer的长度。     返回值:获取成功则返

cscmaker的专栏 7万+

ContextCapture系列教程(三):大疆精灵4RTK版无人机POS数据提取、处理(处理后勉强达到免相控要求)

大疆精灵 Phantom 4 RTK于2018年发布,是大疆为高精度建图与精准飞行设计的行业级无人机,在精灵4无人机外形的基础上,机身增加了RTK模块,可以实现高精度 RTK 定位导航,相机与 RTK 系统采用微秒级时间同步,可以通过app 进行航线规划飞行

pausau的博客 1万+

Android SELinux——neverallow问题处理(十六)

遇到 neverallow 规则问题,千万别急着去注释/剔除里面原有的规则(原生的尽量别动)。增加 allow 规则是常见的解决办法,但是随着 android 版本的升级,系统对 SELinux 的管控越来越严,增加了大量的 neverallow。一般情况下,向默认标签授予权限的做法是错误的,其中许多权限都是 neverallow 规则所不允许的。按照上面方法去添加 SELinux 可能会违反了 neverallow 规则,编译时候会报 neverallow 相关的错误。

小旭的专栏 2655

c/c++获取当前代码运行的路径

mac和Linux的方法是一样的,但是和windows有差异,如果要写出既可以在windows运行,又可以在Linux运行的代码,则需要增加代码宏控设置,判断不同的平台使用不同的代码,可以参考这篇文章:c/c++判断当前操作系统类型 mac、Linux #include "iostream" #include <unistd.h> using namespace std; int main(int argc, char** argv) { const int MAXPATH=250;

性感的小君君 6895

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

c/c++获取可执行程序的绝对路径(Linux、Windows)

今天改动一个程序,需要在linux环境获取执行程序的绝对路径,搜索到两个函数,在此做下记录和对比。 函数1:char *getcwd(char *buf, size_t size); 头文件:unistd.h 获取到可执行程序的绝对路径,存放到buf中,size是指定的buf大小。若size指定的大小比 buf短,会返回NULL。若不知道buf的...

giveaname的专栏 2万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux系统 C/C++获取当前文件夹路径和文件名

文章目录一、文件夹路径获取1.1 头文件1.2 函数原型1.2.1 getcwd() 一、文件夹路径获取 1.1 头文件 #include <unistd.h> // Linux系统中 #include <direct.h> // windows系统中 1.2 函数原型 1.2.1 getcwd() char* getcwd(char buf, size_t size); 返回值是char *的路径 参数 buf: 返回的缓冲区 ...

qq_40250056的博客 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C语言几种获取自身路径的方法

很多程序都需获取自己的路径,这里提供了几种方法。 1._pgmptr 这个东西源自stdlib.h,是个字符串,可以直接调用. #include <stdio.h> #include <stdlib.h> int main() { printf("%s\n",_pgmptr); system("pause"); return 0; } 输出exe绝对路径. 2....

cjz2005的博客 1万+

[C/C++] 获取当前程序路径(windows 和 linux)

// 定义变量,用户存放程序路径 TCHAR m_InstallPath[2*MAX_PATH] = {0x00}; //************************************ // Method: GetInstallPath // FullName: CPrintClientDlg::GetInstallPath // Access: public...

就是那个党伟 7699

C++ 获取绝对路径

https://www.cnblogs.com/cgli/archive/2012/12/03/2800468.html char *_getcwd(char *buffer, int maxlen); //ANSI版本 wchar_t *_wgetcwd(wchar_t *buffer, int maxlen ); //Unicode版本 将当前路径的绝对地址给buffer ...

u012719076的博客 2980

嵌入式linux开发,C/C++获取运行程序自身路径,获取当前绝对路径

寞水

寞水 1370

C++获取当前工作目录,获取exe文件目录

不过以上两种目录路径碰到文件夹带有“.”就完蛋了,如当前程序放在 D:\\myproject\\test-1.0\\win-app\\目录下,要想通过GetCurrentDiretory或GetModuleFileName来获取当前目录(想要得到:D:\\myproject\\test-1.0\\win-app), 永远不正确,每次都是:D:\\myproject\\test-1.0 目录,去掉"1.0"之后,就能正确得到D:\\myproject\\test-1.0\\win-app目录。

60801 3716

C、C++ 在Linux系统下获取当前可执行程序所在路径的方法

利用符号链接,获取当前程序完整路径后截取所需部分。

risen999的博客 1314

C/C++获取当前路径

Windows下: string strPath; char chpath[MAX_PATH]; GetModuleFileName(NULL, chpath, sizeof(chpath)); strPath = (string)chpath; int pos = strPath.find_last_of('\\', strPath.length()); strPath.su

overlord_bingo的博客 1857
上一篇: C/C++ Windows和Linux通用的一个函数,从文件路径中 提取 (文件名) 和 (文件后缀)
下一篇: C/C++ 字符串分割
cpp_learners
博客等级 码龄7年 1526粉丝 274原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值