VC新建目录CreateDirectory、得到exe存放路径GetModuleFileName、获取当前目录GetCurrentDirectory、CFileDialog设置打开默认路径...

本文介绍了Windows系统中创建目录的函数CreateDirectory的使用方法,包括如何设置安全属性,以及如何处理创建多级目录的情况。此外,还详细阐述了获取程序当前路径的GetModuleFileName函数和GetCurrentDirectory函数的作用,提供了在不同场景下获取路径的技巧。
部署运行你感兴趣的模型镜像

新建目录CreateDirectory

第一个参数值为文件夹名称,第二个参数值为安全属性,一般设置为NULL即可。如果正确创建,返回值为1,如果没有正常创建文件夹,则返回0。

  特别的:该函数每次调用时都只能创建一级文件夹,即文件夹中不能再包含子文件夹。
  当希望创建含有子文件夹的文件夹时,可以先使用该函数创建一级文件夹,然后再使用该函数在一级文件夹下创建子文件夹。如:
  希望创建:d:\\TEST\\temp,
  则:CString str = “d:\\TEST”;
  CreateDirectory(str, NULL);
  str = str + \\temp;
  CreateDirectory(str, NULL);

CString szDir;
szDir="C:\\temp";//临时文件夹
DWORD dwAttr=GetFileAttributes(szDir);
if(dwAttr==0xFFFFFFFF)  //临时文件夹不存在则创建
{
    CreateDirectory(szDir,NULL);
)
//.........chuli
RemoveDirectory(szDir);//删除文件夹

得到运行程序所在路径全路径(exe或其他模块文件名称,程序目录):GetModuleFileName。

函数原型:

  DWORD GetModuleFileName(
  HMODULE hModule,
  LPTSTR lpFilename,
  DWORD nSize
  );
  函数参数说明:
  hModule HMODULE 装载一个程序实例的句柄。如果该参数为NULL,该函数返回该当前应用程序全路径。
  lpFileName LPTSTR 是你存放返回的名字的内存块的指针,是一个输出参数
  nSize DWORD ,装载到缓冲区lpFileName的最大值
  函数返回值:
  如果返回为成功,将在lpFileName的缓冲区当中返回相应模块的路径,如果所设的nSize过小,那么返回仅按所设置缓冲区大小返回相应字符串内容。
  如果函数失败,返回值将为0,利用GetLastError可获得异常代码。
  需要的头文件为:

  windows.h


  
#include <windows.h>
  #include <stdio.h>
  BOOL CreateSampleService()
  {
  TCHAR szPath[MAX_PATH];
  if( !GetModuleFileName( NULL, szPath, MAX_PATH ) )
  {
  printf("GetModuleFileName failed (%d)\n", GetLastError());
  return FALSE;
  }
  return TRUE;
  }

获取程序当前路径GetCurrentDirectory(当前进程的当前路径,即程序实例目录,会随着操作的改变而改变)

DWORD GetCurrentDirectory(   DWORD nBufferLength, // size of directory buffer   LPTSTR lpBuffer // directory buffer   );

  函数功能
  获取当前进程的当前目录
  参数说明
  参数 类型及说明
  nBufferLength 缓冲区的长度
  lpBuffer 指定一个预定义字串,用于装载当前目录
  返回值
  调用成功 返回装载到lpBuffer的字节数。
  如nBufferLength的长度不够,不足以容纳目录,则返回值是必要的缓冲区长度(要求至少这个长度),其中包括空中止字符。零表示失败。使用GetLastError函数可获得错误信息

CFileDialog设置打开默认路径dlg.m_ofn.lpstrInitialDir="D:\\Program File";

谨记:CFileDialog会改变程序的默认执行路径,比较稳妥的办法还是绝对路径来访问文件比较好。在程序刚一跑起来的时候,先用GetCurrentDirectory()或是GetModuleFileName()获得当前可执行文件所在的路径,并保存起来。以后即使是用CFileDialog改变了当前的路径,也能很容易地找回来。

CFileDialog Dlg(TRUE,NULL,NULL,0,"ASCII Data Files(*.asc)|*.asc|所有文件 (*.*)|*.*||");
	char pBuf[MAX_PATH];                                 //存放路径的变量       
	
	GetCurrentDirectory(MAX_PATH,pBuf);                   //获取程序的当前目录
	
	strcat(pBuf,"\\");
	
	CString strtemp=pBuf;
	

	Dlg.m_ofn.lpstrInitialDir=pBuf;

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>我们注意到用户的问题集中在如何获取当前运行的.exe程序的所在路径。在MFC中,这是一个常见的需求,通常用于定位程序运行目录下的配置文件或其他资源。 根据引用[1]和[2]提供的信息,有两种主要方法: 1. 使用`GetCurrentDirectory`:但这种方法可能会因为程序中的文件操作(如打开文件对话框)而改变当前工作目录,因此不可靠。 2. 使用`GetModuleFileName`:这是更可靠的方法,它直接获取当前模块(即.exe)的完整路径,然后我们可以提取目录部分。 因此,我们重点介绍第二种方法。 ### MFC中获取当前.exe程序所在路径的方法 在MFC应用程序中,可以通过以下步骤获取当前运行的.exe文件的所在目录: 1. **使用`GetModuleFileName`函数获取完整路径**: - 该函数需要传入当前模块的句柄(对于主程序,可以使用`NULL`或`GetModuleHandle(NULL)`)和一个缓冲区。 - 函数将返回.exe文件的完整路径(包括文件名)。 2. **从完整路径中提取目录部分**: - 通过查找最后一个反斜杠`\`的位置,将路径截断到该位置,即可得到目录路径。 #### 示例代码 下面是一个封装好的函数,用于获取当前.exe程序所在的目录路径(不包含文件名): ```cpp #include <Windows.h> // 包含GetModuleFileName的声明 CString GetExePath() { TCHAR szPath[MAX_PATH] = { 0 }; // 获取当前模块(exe)的完整路径 if (GetModuleFileName(NULL, szPath, MAX_PATH) == 0) { // 获取失败,返回空字符串 return CString(_T("")); } CString strPath(szPath); // 查找最后一个反斜杠的位置 int nPos = strPath.ReverseFind(_T('\\')); if (nPos < 0) { // 如果没有找到反斜杠,返回空字符串 return CString(_T("")); } // 截取目录部分(不包括最后一个反斜杠之后的文件名) return strPath.Left(nPos); } ``` #### 代码说明: - `GetModuleFileName(NULL, szPath, MAX_PATH)`: 第一个参数为`NULL`表示获取当前程的.exe文件路径。 - `ReverseFind('\\')`: 在路径字符串中从后往前查找反斜杠,以定位文件名前的最后一个目录分隔符。 - `strPath.Left(nPos)`: 截取从开始到最后一个反斜杠位置的子字符串,即目录路径。 #### 使用示例 假设在MFC对话框应用中,我们想在一个按钮点击事件中显示当前程序的路径: ```cpp void CMyDialog::OnBnClickedButtonGetPath() { CString strPath = GetExePath(); if (!strPath.IsEmpty()) { SetDlgItemText(IDC_EDIT_PATH, strPath); // IDC_EDIT_PATH是一个编辑框的ID } else { AfxMessageBox(_T("获取程序路径失败!")); } } ``` #### 注意事项 1. **路径分隔符**: Windows中通常使用反斜杠`\`,但也要注意在跨平台时可能需要处理不同的分隔符。 2. **路径长度**: `MAX_PATH`(260个字符)可能不足以支持长路径。在Windows 10及更高版本中,可以通过启用长路径支持来避免此问题,但对于旧版本,需要额外处理。 3. **错误处理**: 当`GetModuleFileName`返回0时,表示调用失败,可通过`GetLastError()`获取错误原因。 #### 相关问题 1. 如何在MFC中获取当前程序的完整路径(包括文件名)? 2. 如何获取其他模块(如DLL)的路径? 3. 如何处理长路径(超过MAX_PATH)的情况? 4. 在MFC中如何设置当前工作目录? [^1]: MFC中获取当前路径的两种方法。 [^2]: 在MFC程序中获取exe文件所在路径的方法。 </think>### MFC中获取当前.exe程序所在路径的方法 在MFC开发中,获取当前运行的.exe程序所在路径是常见需求,特别是在读取配置文件或访问资源文件时。以下是三种可靠方法,按推荐程度排序: #### 1. **推荐方法:使用`GetModuleFileName`获取完整路径(最可靠)** ```cpp CString GetExeDirectory() { TCHAR szPath[MAX_PATH] = {0}; // 获取当前exe的完整路径 if(GetModuleFileName(NULL, szPath, MAX_PATH) == 0) return CString(_T("")); // 失败返回空字符串 // 提取目录部分(去除文件名) CString strPath(szPath); int nPos = strPath.ReverseFind(_T('\\')); if(nPos > 0) return strPath.Left(nPos); // 返回目录路径 return strPath; // 没有反斜杠则返回完整路径 } ``` **优点**: - 直接获取可执行文件的实际位置[^1] - 不受当前工作目录变化影响(文件对话框操作不会改变结果) - 适用于所有Windows版本 #### 2. **备选方法:使用`GetCurrentDirectory`(注意限制)** ```cpp CString GetWorkDir() { TCHAR szPath[MAX_PATH] = {0}; if(GetCurrentDirectory(MAX_PATH, szPath) == 0) return CString(_T("")); return CString(szPath); } ``` **注意事项**: - 获取的是**程当前工作目录**,非exe位置 - 会被文件对话框等操作改变[^1] - 仅当程序未修改工作目录时有效 #### 3. **扩展方法:获取完整EXE路径(含文件名)** ```cpp CString GetExeFullPath() { TCHAR szPath[MAX_PATH] = {0}; GetModuleFileName(NULL, szPath, MAX_PATH); return CString(szPath); } ``` ### 使用示例 在MFC对话框应用中显示程序路径: ```cpp void CMyDialog::OnBnClickedShowPath() { CString strPath = GetExeDirectory(); // 使用推荐方法 // 在编辑框中显示路径 CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_PATH); pEdit->SetWindowText(strPath); // 可选:打开资源管理器 if(!strPath.IsEmpty()) { ShellExecute(NULL, _T("open"), _T("explorer"), strPath, NULL, SW_SHOWNORMAL); } } ``` ### 关键注意事项 1. **路径格式**:返回路径结尾不包含反斜杠(如 `C:\MyApp` 而非 `C:\MyApp\`) 2. **特殊目录**:需要访问系统目录时使用API如`SHGetSpecialFolderPath` 3. **长路径支持**:Windows 10+ 建议使用`GetModuleFileNameEx`支持超过MAX_PATH的路径 4. **错误处理**:`GetModuleFileName`返回0表示失败,可用`GetLastError()`获取详情 ### 应用场景 ```mermaid graph LR A[获取EXE路径] --> B[读取配置文件] A --> C[加载资源文件] A --> D[写入日志文件] A --> E[存储用户数据] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值