ROS&C++文件操作——获取当前工作路径的几种方法

简介: ROS&C++文件操作——获取当前工作路径的几种方法

1.采用GetCurrentDirectory,用于获取当前进程的当前目录


CString FilePathName;
 char path[MAX_PATH];
 CFileDialog dlg(TRUE);
 //保存当前路径
 GetCurrentDirectory(MAX_PATH,path); // 文件目录保存在path这个字符数组中,
 if (dlg.DoModal()==IDOK) // 在这里,用文件对话框成功打开一个文件后,该目录就被修改为被打开的文件所在目录了
 {
 FilePathName=dlg.GetPathName();
 system.setReplayFile(FilePathName);  // 实际上是把这个文件名保存在CDataRecord类的 readFileDir 这个成员变量里
 }
 else
 {
 }
 //恢复当前路径
 SetCurrentDirectory(path); // 使目录重新恢复成了path这个目录


2.getcwd获取当前工作目录,类似上一方法


#include  <direct.h>  
#include  <stdio.h> 
char   buffer[MAX_PATH];   
getcwd(buffer, MAX_PATH);


运行得到"D:<项目名><项目名>"


  1. 获取上一级目录如:


string path = "D:\\newmap_build\\newmap_addressquery_proj\\Debug\\dict";
int npos = path.find_last_of("\\");
string subpath = path.substr(0,npos);
//结果subpath = D:\\newmap_build\\newmap_addressquery_proj\\Debug;


  1. 获取文件的类型如:


string path = "D:\\newmap_build\\newmap_addressquery_proj\\Debug\\dict.shp";
int npos = path.find_last_of(".");
string filename = path.substr(npos,path.length());
//结果subpath = .shp;


3.采用GetModuleFileName,用于获取所在exe/dll所在路径下的目录


TCHAR szPath[_MAX_PATH]={0};
TCHAR szDrive[_MAX_DRIVE]={0};
TCHAR szDir[_MAX_DIR]={0};
TCHAR szFname[_MAX_FNAME]={0}; 
TCHAR szExt[_MAX_EXT]={0};
GetModuleFileName(NULL,szPath,sizeof(szPath));  
ZeroMemory(g_wszProgramPath,sizeof(g_wszProgramPath));
_wsplitpath_s(szPath, szDrive, szDir, szFname, szExt);
wsprintf(g_wszProgramPath,_T("%s%s"), szDrive, szDir);


第二种获取写法


CString path;   
GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);   
path.ReleaseBuffer();   
int pos = path.ReverseFind('\\');   
path = path.Left(pos);


运行得到 “D:<项目名>\x64\Debug”


如果需要获取DLL所在路径,则在GetModuleFileName函数中第一个参数传入DLL对应的Module Handle,


这个Handle的获取:将DllMain中的hinstDLL保存(可以用全局变量保存),然后作为第一个参数传给GetModuleFileName


BOOL APIENTRY DllMain( HMODULE hModule,
     DWORD  ul_reason_for_call,
     LPVOID lpReserved
  )


其中,hModule可以通过如下方式获取


HMODULE h = GetModuleHandle("TestLibrary.dll");


ROS 环境中可以使用ros::package::getPath来实现类似的C++路径获取


#include<ros/package.h>
  std::string fisheye_setting = ros::package::getPath("real_sense_multi");



相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
ROS入门实践
本课程将基于基础设施即代码 IaC 的理念,介绍阿里云自动化编排服务ROS的概念、功能和使用方式,并通过实际应用场景介绍如何借助ROS实现云资源的自动化部署,使得云上资源部署和运维工作更为高效。
相关文章
|
20天前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
364 2
|
2月前
|
存储 缓存 监控
用 C++ 红黑树给公司电脑监控软件的日志快速排序的方法
本文介绍基于C++红黑树算法实现公司监控电脑软件的日志高效管理,利用其自平衡特性提升日志排序、检索与动态更新效率,并结合实际场景提出优化方向,增强系统性能与稳定性。
80 4
|
算法 Linux C++
C++框架设计中实现可扩展性的方法
在软件开发中,可扩展性至关重要,尤其对于C++这样的静态类型语言。本文探讨了在C++框架设计中实现可扩展性的方法:1) 模块化设计降低耦合;2) 使用继承和接口实现功能扩展;3) 通过插件机制动态添加功能;4) 利用模板和泛型提升代码复用;5) 遵循设计原则和最佳实践;6) 应用配置和策略模式以改变运行时行为;7) 使用工厂和抽象工厂模式创建可扩展的对象;8) 实现依赖注入增强灵活性。这些策略有助于构建适应变化、易于维护的C++框架。
858 2
|
C++ iOS开发
C++ 文件操作的技术性文章
C++ 文件操作的技术性文章
100 0
|
编译器 API C语言
超级好用的C++实用库之跨平台实用方法
超级好用的C++实用库之跨平台实用方法
171 6
|
算法 机器人 C语言
ROS仿真支持C++和C语言
ROS仿真支持C++和C语言
437 1
|
JavaScript 前端开发 Java
通过Gtest访问C++静态、私有、保护变量和方法
通过Gtest访问C++静态、私有、保护变量和方法
317 0
|
C++
C++ 避免多重定义的方法
C++ 避免多重定义的方法
138 0
|
编译器 C++
VS Code设置C++编译器路径
VS Code设置C++编译器路径
602 0

推荐镜像

更多
  • ros