VC上或取当前路径有多种方法,最常用的是使用 GetCurrentDirectory和GetModuleFileName函数,个中都有诸多注意事项,特别总结一下

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

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-);

参考资料:

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[];
memset(szFileName,'"0',sizeof(szFileName)); GetModuleFileName(NULL,szFileName, sizeof(szFileName)); //再分割完整路径的字符串,最后一个就是程序的名字
char seps[] = "\\" ;
char *token = NULL; char exeName[];
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 ;
}

其它参考链接:C语言字符串操作总结大全(超详细)

VC++获取当前路径及程序名的实现代码的更多相关文章

  1. 【linux】shell代码,获取当前路径,创建文件夹

    #!/bin/bash CURRENT_PATH=`` cd $CURRENT_PATH MY_LOG=/var/log MY_DB=/var/lib/db [ ! -d $MY_LOG ] & ...

  2. [No00006F]总结C#获取当前路径的各种方法

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. VC++获取IDC_EDIT的7种方法

    VC++获取IDC_EDIT的7种方法 http://blog.csdn.net/baizengfei/article/details/7997618 //第一种方法 int number1, num ...

  4. C#获取当前路径的7种方法

    总结C#获取当前路径的7种方法 C#获取当前路径的方法如下: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName ...

  5. 【转】C#(ASP.Net)获取当前路径的方法集合

    转自:http://www.gaobo.info/read.php/660.htm //获取当前进程的完整路径,包含文件名(进程名). string str = this.GetType().Asse ...

  6. C#获取当前路径的方法

    C#获取当前路径的方法如下: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. 2. ...

  7. 转:VC++获取屏幕大小第一篇 像素大小GetSystemMetrics

    VC++获取屏幕大小第一篇 像素大小 GetSystemMetrics>和<VC++获取屏幕大小第二篇物理大小GetDeviceCaps 上>和<VC++获取屏幕大小第三篇物理 ...

  8. C#获取当前路径的几种方法

    C#获取当前路径的方法如下: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. 2. ...

  9. java web 项目中获取当前路径的几种方法

    1.jsp中取得路径:   以工程名为TEST为例: (1)得到包含工程名的当前页面全路径:request.getRequestURI() 结果:/TEST/test.jsp (2)得到工程名:req ...

随机推荐

  1. ASP.NET Core 2 学习笔记(十三)Swagger

    Swagger也算是行之有年的API文件生成器,只要在API上使用C#的<summary />文件注解标签,就可以产生精美的线上文件,并且对RESTful API有良好的支持.不仅支持生成 ...

  2. ajax获取富文本数据无法正常渲染到页面问题

    有时候富文本渲染到页面的时候 会连带标签一起渲染出来. 解决办法: 首先引用    <script src="https://cdn.jsdelivr.net/npm/fuwenben ...

  3. koa 中,中间件异步与同步的相关问题

    同步中间件很容易理解,如以下代码: const Router = require('koa-router') , koa = new Router({ prefix: '/koa' }) , fs = ...

  4. Linux 网络流量查看 Linux ip traffic monitor

    Network monitoring on Linux This post mentions some linux command line tools that can be used to mon ...

  5. 一步一步pwn路由器之radare2使用全解

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 radare2 最近越来越流行,已经进入 github 前 25了 ...

  6. redis 管道技术 pipeline 简介

    redis数据库的主要瓶颈是网络速度,其次是内存与cpu.在应用允许的情况下,优先使用pipeline批量操作.pipeline批量发出请求/一次性获取响应:不是发出多个请求,每个请求都阻塞等待响应, ...

  7. Eclipse 配置 maven 的两个 settings 文件

    eclipse配置的settings文件名完全可以自定义,而本机maven只认识settings.xml文件. eclipse里配置maven有一个叫全局的,有一个叫用户的.这两个文件可以和本机mav ...

  8. shell黑名单

    #/bin/bash netstat -ant | " | awk '{print $5}' | grep -v "^10" | cut -d ":" ...

  9. OpenStreetMap、googleMap等经纬度和行列号之间相互转化(python,JavaScript,php,Java,C#等)

    python: # OpenStreetMap经纬度转行列号 def deg2num(lat_deg, lon_deg, zoom): lat_rad = math.radians(lat_deg) ...

  10. 《SQL Server 2008从入门到精通》--20180628

    数据库基本概念:区.页.行 区:SQL Server中管理空间的基本单位.一个区大小为64KB,是八个物理上连续的页.SQL Server中每MB有16个区.一旦一个区被存储满,SQL Server将 ...