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使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
相关文章
|
4月前
|
算法 Linux C++
C++框架设计中实现可扩展性的方法
在软件开发中,可扩展性至关重要,尤其对于C++这样的静态类型语言。本文探讨了在C++框架设计中实现可扩展性的方法:1) 模块化设计降低耦合;2) 使用继承和接口实现功能扩展;3) 通过插件机制动态添加功能;4) 利用模板和泛型提升代码复用;5) 遵循设计原则和最佳实践;6) 应用配置和策略模式以改变运行时行为;7) 使用工厂和抽象工厂模式创建可扩展的对象;8) 实现依赖注入增强灵活性。这些策略有助于构建适应变化、易于维护的C++框架。
245 2
|
11天前
|
编译器 API C语言
超级好用的C++实用库之跨平台实用方法
超级好用的C++实用库之跨平台实用方法
24 6
|
23天前
|
算法 机器人 C语言
ROS仿真支持C++和C语言
ROS仿真支持C++和C语言
33 1
|
5月前
|
C++ iOS开发
C++ 文件操作的技术性文章
C++ 文件操作的技术性文章
27 0
|
27天前
|
JavaScript 前端开发 Java
通过Gtest访问C++静态、私有、保护变量和方法
通过Gtest访问C++静态、私有、保护变量和方法
28 0
|
2月前
|
C++
C++ 避免多重定义的方法
C++ 避免多重定义的方法
46 0
|
2月前
|
编译器 C++
VS Code设置C++编译器路径
VS Code设置C++编译器路径
33 0
|
2月前
|
Dart API C语言
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
|
4月前
|
存储 C++
C++文件操作
C++文件操作

推荐镜像

更多