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

举报
Hermit_Rabbit 发表于 2022/08/15 13:55:18 2022/08/15
1.6k+ 0 0
【摘要】 1.采用GetCurrentDirectory,用于获取当前进程的当前目录CString FilePathName; char path[MAX_PATH]; CFileDialog dlg(TRUE); //保存当前路径 GetCurrentDirectory(MAX_PATH,path); // 文件目录保存在path这个字符数组中, if (dlg.DoModal()==IDOK) /...

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;

2.获取文件的类型如:

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");
  1. ROS 环境中可以使用ros::package::getPath来实现类似的C++路径获取
#include<ros/package.h>
  std::string fisheye_setting = ros::package::getPath("real_sense_multi");
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。