VC获取当前路径及程序名的实现代码

 更新时间:2020年4月25日 17:34  点击:1806

一、获取当前运行目录的绝对路径

1、使用GetCurrentDirectory函数
假设程序路径为D:\Test\tst.exe,执行GetCurrentDirectory函数

char pBuf[MAX_PATH];
GetCurrentDirectory(MAX_PATH,pBuf);

pBuf="D:\Test"
但是如果使用CFileDialog、CFile::Open等函数后,设置不当则会导致再次获取当前路径值改变。所以,如要避免当前路径改变,如果使用CFileDialog,则要把在CFileDialog的dwFlags标志设置为OFN_NOCHANGEDIR。如下:

CFileDialog hFileDlg(false,NULL ,
		NULL,
		OFN_FILEMUSTEXIST | OFN_READONLY | OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR,
		TEXT("Text Files (*.txt)|*.txt|All Files(*.*)|*.*|"),
		NULL);

也可以,先执行GetCurrentDirectory把获取到目录路径保存下来,处理完成后,再次SetCurrentDirectory设置一下。
2、使用GetModuleFileName

CString strCurPath;
	GetModuleFileName(NULL,strCurPath.GetBuffer(MAX_PATH),MAX_PATH);
 	int pos= strCurPath.ReverseFind(_T('\\'));
 	strCurPath = strCurPath.Left(pos);

输出(路径包括运行文件名):
strCurPath="D:\Test\tst.exe"
二、获取打开文件的完整路径

通过对话框打开文件时,一般均需获取打开文件的完整路径,可使用CFileDialog的GetPathName函数,代码如下:

CFileDialog hFileDlg(false,NULL ,
	NULL,
	OFN_FILEMUSTEXIST | OFN_READONLY | OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR,
	TEXT("Text Files (*.txt)|*.txt|All Files(*.*)|*.*|"),
	NULL);
if(hFileDlg.DoModal() == IDOK) {
	m_strEdtSrcFile = hFileDlg.GetPathName();
	UpdateData(FALSE);
}

三、获取当前运行程序名

通过GetModuleFileName获取完整路径后,可以使用PathStripPath API函数解析路径,代码示例如下:

/*
#include "shlwapi.h"
#pragma comment(lib, "shlwapi.lib ")
*/

TCHAR szPath2[] = TEXT("D:\\Test\\tst.exe");
PathStripPath(szPath2);
// Result: szPath2 ==tst.exe
 
TCHAR szPath3[] = TEXT("D:\\Test\\Debug");
PathStripPath(szPath3);
// Result: szPath3 == Debug

TCHAR szPath4[] = TEXT("D:\\Test\\Debug\\");
PathStripPath(szPath4);
// Result: szPath4 == Debug\

TCHAR szPath5[] = TEXT("D:\\");
PathStripPath(szPath5);
// Result: szPath5 == D:\ 

使用此函数要注意,并非只是提取文件名,如果它不能识别时,则会返回原始字符串(不做处理)。所以,不放心的话,自己手动提取文件名更为保险。

CString strCurPath;
GetModuleFileName(NULL,strCurPath.GetBuffer(MAX_PATH),MAX_PATH)
strCurPath.ReleaseBuffer();//Must ReleaseBuffer, or GetLength=0
int pos= strCurPath.ReverseFind(_T('\\'));
int len = strCurPath.GetLength();
strCurPath = strCurPath.Right(len-pos-1);

参考资料:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb773756%28v=vs.85%29.aspx

CString 诡异的 GetLength() 返回 0

如果CString是从GetPrivateProfileStr()返回的
记得return 该CString 前 释放buffer
要不,CString.GetLength()将返回0
找了半天原因,
----------------------------------------------------
“If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions. ”

在i=m_SZFileName.GetLength()之前调用m_SZFileName.ReleaseBuffer()就可以了。

临时搞两天VC,在VC里如何获取当前程序的名字和路径以及如何分割字符串

#include "stdafx.h"
#include <windows.h> 
 

int main(int argc, char* argv[])

{
 //先获取运行程序的完整路径
 char szFileName[256];
 memset(szFileName,'"0',sizeof(szFileName));

 GetModuleFileName(NULL,szFileName, sizeof(szFileName)); 

 //再分割完整路径的字符串,最后一个就是程序的名字 
 char seps[] = "\\" ; 
 char *token = NULL; 
 
 char exeName[256];
 memset(exeName,'\0',sizeof(exeName));
 
 token = strtok( szFileName, seps ); 
 while( token != NULL ) 
 { 
   sprintf(exeName,"%s",token);
   token = strtok( NULL, seps ); 
   
  }
  printf("%s\n",exeName); 
  getchar();
  return 0;
}

[!--infotagslink--]

相关文章

  • SpringMVC文件上传原理及实现过程解析

    这篇文章主要介绍了SpringMVC文件上传原理及实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-15
  • C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?

    这篇文章主要介绍了C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?,这也小编做.NET项目时经常思考和让人混乱的一个问题,这篇文章写的挺好,一下清晰了许多,需要的朋友可以参考下...2020-06-25
  • 使用Maven 搭建 Spring MVC 本地部署Tomcat的详细教程

    这篇文章主要介绍了使用Maven 搭建 Spring MVC 本地部署Tomcat,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-08-16
  • SpringMvc自动装箱及GET请求参数原理解析

    这篇文章主要介绍了SpringMvc自动装箱及GET请求参数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
  • SpringMvc获取请求头请求体消息过程解析

    这篇文章主要介绍了SpringMvc获取请求头请求体消息过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-17
  • vc提示unexpected end of file found的原因分析

    这篇文章主要介绍了vc提示unexpected end of file found的原因分析,给出了几点常见错误原因的分析,需要的朋友可以参考下...2020-04-25
  • Springmvc ResponseBody响应json数据实现过程

    这篇文章主要介绍了Springmvc ResponseBody响应json数据实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-26
  • 基于C#后台调用跨域MVC服务及带Cookie验证的实现

    本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下...2020-06-25
  • 详解CocosCreator MVC架构

    这篇文章主要介绍了CocosCreator MVC架构,同学们在制作游戏过程中,尽量使用一些架构,会避免很多问题...2021-04-16
  • Spring MVC 处理一个请求的流程

    Spring MVC是Spring系列框架中使用频率最高的部分。不管是Spring Boot还是传统的Spring项目,只要是Web项目都会使用到Spring MVC部分。因此程序员一定要熟练掌握MVC部分。本篇博客简要分析Spring MVC处理一个请求的流程。...2021-02-06
  • 理解javascript中的MVC模式

    这篇文章主要为大家介绍了javascript中的MVC模式,MVC是一种软件架构模式,一般把软件模式分为三部分,本文就针对MVC模式的三部分进行讲解,感兴趣的小伙伴们可以参考一下...2016-02-01
  • 仅30行代码实现Javascript中的MVC

    这篇文章主要介绍了仅30行代码实现Javascript中的MVC的方法,MVC的基础是观察者模式,这是实现model和view同步的关键,想要深入了解的朋友可以参考本文...2016-02-18
  • 使用jQuery.form.js/springmvc框架实现文件上传功能

    这篇文章主要介绍了使用jQuery.form.jsspringmvc框架实现文件上传功能,非常具有参考借鉴价值,感兴趣的朋友一起学习吧...2016-05-14
  • SpringMVC和rabbitmq集成的使用案例

    这篇文章主要介绍了SpringMVC和rabbitmq集成的使用案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-20
  • AngularJS教程之MVC体系结构详解

    本文主要讲解AngularJS MVC体系结构,这里提供详细的教程供大家学习参考,有需要的小伙伴可以参考下...2016-08-24
  • web面试MVC与MVVM区别及Vue为什么不完全遵守MVVM解答

    这篇文章主要介绍了web面试中常问问题,MVC与MVVM区别以及Vue为什么不完全遵守MVVM的难点解答,有需要的朋友可以借鉴参考下,希望能够有所帮助...2021-09-24
  • ASP.NET MVC API 接口验证的示例代码

    本篇文章主要介绍了ASP.NET MVC API 接口验证的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2021-09-22
  • SpringMVC中的handlerMappings对象用法

    这篇文章主要介绍了SpringMVC中的handlerMappings对象用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-26
  • ASP.NET Core MVC如何实现运行时动态定义Controller类型

    这篇文章主要介绍了ASP.NET Core MVC如何实现运行时动态定义Controller类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • VC中CDC、HDC、pDC区别与联系及相互转换

    这篇文章主要介绍了VC中CDC、HDC、pDC区别与联系及相互转换的方法,非常的详细,有需要的小伙伴可以参考下,希望对大家学习VC能够有所帮助。...2020-04-25