C++ getcwd函数获取项目运行路径方法详解

 更新时间:2022年10月09日 09:34:14   作者:cpp_learners  
在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;
}

在VS中运行截图:

直接运行.exe截图:

解释上面提到的问题:

这里解释一下运行路径,即是程序开始运行的路径,例如:

  • 如果是在Windows环境的VS编译器中运行项目,则返回的是项目路径,即代码文件路径(.h和.cpp路径),因为是在编译器中运行的项目,所以程序的运行路径也是才项目路径中开始运行的。
  • 如果是在Windows环境,运行已经编译好的.exe程序,则返回的是当前.exe程序所在的路径,因为是在当前路径所运行的!
  • 在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++ getcwd函数获取项目运行路径方法详解的文章就介绍到这了,更多相关C++ getcwd函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++关于构造函数可向父类或者本类传参的讲解

    C++关于构造函数可向父类或者本类传参的讲解

    今天小编就为大家分享一篇关于C++关于构造函数可向父类或者本类传参的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++-操作符重载、并实现复数类详解

    C++-操作符重载、并实现复数类详解

    这篇文章主要介绍了C++-操作符重载、并实现复数类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • C语言实现经典排序算法的示例代码

    C语言实现经典排序算法的示例代码

    这篇文章主要为大家详细介绍了如何利用C语言实现经典排序算法中的冒泡排序、选择排序、插入排序、希尔排序,文中的示例代码讲解详细,需要的可以参考一下
    2022-08-08
  • C语言形参和实参传值和传址详解刨析

    C语言形参和实参传值和传址详解刨析

    形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用,形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送
    2021-11-11
  • C++实现简易的五子棋游戏

    C++实现简易的五子棋游戏

    这篇文章主要为大家详细介绍了C++实现简易的五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Qt可视化大屏布局的实现

    Qt可视化大屏布局的实现

    数据可视化大屏在项目中的使用很常见,本文主要介绍了Qt可视化大屏布局的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • C++实现模板中的非类型参数的方法

    C++实现模板中的非类型参数的方法

    这篇文章主要介绍了C++实现模板中的非类型参数的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • C语言实现三子棋小游戏详解

    C语言实现三子棋小游戏详解

    这篇文章主要为大家详细介绍了C语言实现三子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C/C++的全缓冲、行缓冲和无缓冲

    C/C++的全缓冲、行缓冲和无缓冲

    这篇文章主要介绍了C/C++的全缓冲、行缓冲和无缓冲的相关知识,帮助大家更好的理解和学习c/c++,感兴趣的朋友可以了解下
    2020-08-08
  • C++ 实现哈希表的实例

    C++ 实现哈希表的实例

    这篇文章主要介绍了C++ 实现哈希表的实例的相关资料,这里使用C++实现哈希表的实例帮助大家彻底理解哈希表的原理,需要的朋友可以参考下
    2017-08-08

最新评论