MFC 获取运行目录

本文介绍了一个C++函数用于获取程序的执行目录,并实现了一个日志记录功能,使用了CString进行字符串操作,通过GetModuleFileName和PathIsDirectory等Windows API函数来获取和创建日志文件夹。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

inline CString GetExeDir()
{
    TCHAR szPath[ MAX_PATH ] = { 0 };
    GetModuleFileName( NULL, szPath, MAX_PATH );

    CString csFullPath( szPath );
    int nPos = csFullPath.ReverseFind( _T( '\\' ) );
    if( nPos < 0 )
        return CString( "" );
    else
        return csFullPath.Left( nPos );
}


写日志

#include <locale> 

inline void WriteLog( const CString& strLog )
{   
    setlocale( LC_CTYPE, ( "chs" ) );//写入中文

    CTime tm = CTime::GetCurrentTime();
    CString strLogDir = GetExeDir() + "/Log/" + tm.Format( "%Y-%m" );
    if( !PathIsDirectory( strLogDir ) )
        CreateDirectory( strLogDir, 0 );

    CString strFilePath = strLogDir + tm.Format( "/Sensitive-%Y-%m-%d.txt" );   
    CString strLogText = tm.Format( "[%Y-%m-%d %H:%M:%S]: " ) + strLog;

    CStdioFile  file;
    BOOL bOpen = file.Open( strFilePath, CFile::modeCreate | CFile::modeReadWrite | CFile::modeNoTruncate );
    if( !bOpen )
        return;
    file.SeekToEnd();
    file.WriteString( strLogText );
    file.WriteString( _T( "\r\n" ) );//换行
    file.Flush();
    file.Close();
}

 

### MFC 获取当前运行目录的方法 在MFC开发中,可以通过多种方式来获取程序的运行目录。以下是几种常用的方式及其具体实现: #### 方法一:使用 `GetCurrentDirectory` 函数 该函数可以用来获取当前工作目录。其声明如下: ```cpp DWORD GetCurrentDirectory( DWORD nBufferLength, LPTSTR lpBuffer ); ``` 通过传递缓冲区大小和指向缓冲区的指针,可以获得当前的工作目录。 代码示例: ```cpp TCHAR* path = new TCHAR[MAX_PATH]; ZeroMemory(path, sizeof(TCHAR) * MAX_PATH); GetCurrentDirectory(MAX_PATH, path); // path 中存储的是当前工作目录 delete[] path; ``` 此方法返回的结果可能不总是与 `.exe` 文件所在的路径一致[^1]。 --- #### 方法二:使用 `GetModuleFileName` 函数 如果需要精确获取可执行文件(`.exe`)所在的路径,则应使用 `GetModuleFileName` 函数。它能够返回模块(即 `.exe` 或者动态链接库 `.dll`)的全路径名。 函数原型为: ```cpp DWORD GetModuleFileName( HMODULE hModule, LPTSTR lpFilename, DWORD nSize ); ``` 其中参数 `hModule` 可设置为 `NULL` 来表示当前进程的可执行文件。 代码示例: ```cpp CString path; GetModuleFileName(NULL, path.GetBufferSetLength(MAX_PATH + 1), MAX_PATH); path.ReleaseBuffer(); // 提 .exe 所在目录部分 int pos = path.ReverseFind(_T('\\')); if (pos != -1) { path = path.Left(pos); // path 存储的是 .exe 的父级目录 } ``` 这种方法适用于大多数场景下获取程序的实际安装位置[^3]。 --- #### 方法三:组合使用 `GetCurrentDirectory` 和 `GetModuleFileName` 有时为了更灵活地处理不同需求,可以选择同时调用上述两个 API 并对比它们之间的差异。例如当希望判断某个特定资源是否存在时,可以根据实际业务逻辑决定优先采用哪个路径作为基础。 综合实例演示: ```cpp void GetProgramPath(CString& exeDir, CString& workDir) { // 获取 EXE 文件所在目录 CString fullPathExe; GetModuleFileName(NULL, fullPathExe.GetBufferSetLength(MAX_PATH + 1), MAX_PATH); fullPathExe.ReleaseBuffer(); int lastBackslashPos = fullPathExe.ReverseFind(_T('\\')); if (lastBackslashPos != -1) exeDir = fullPathExe.Left(lastBackslashPos); // 获取当前工作目录 TCHAR currentWorkDir[MAX_PATH]; GetCurrentDirectory(MAX_PATH, currentWorkDir); workDir = currentWorkDir; // 输出结果供调试查看 #ifdef _DEBUG TRACE(_T("EXE Path: %s\n"), static_cast<LPCTSTR>(exeDir)); TRACE(_T("Working Directory: %s\n"), static_cast<LPCTSTR>(workDir)); #endif } ``` 以上实现了分别提 `.exe` 运行目录以及当前活动的工作空间地址[^4]。 --- ### 总结 对于绝大多数情况而言,推荐利用 **`GetModuleFileName`** 配合字符串操作去除掉最终组件名称从而得到确切的应用启动点;而仅需了解即时作业环境则可以直接选用 **`GetCurrentDirectory`** 即可满足基本查询诉求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值