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


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

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

    1、使用GetCurrentDirectory函数
    假设程序路径为D:Test st.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 st.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,'',sizeof(exeName));
     
     token = strtok( szFileName, seps ); 
     while( token != NULL ) 
     { 
       sprintf(exeName,"%s",token);
       token = strtok( NULL, seps ); 
       
      }
      printf("%s
    ",exeName); 
      getchar();
      return 0;
    }

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

  • 相关阅读:
    同步内核缓冲区sync、fsync和fdatasync函数
    HDU 1496 Train Problem I 火车问题1(桟,水)
    HDU 1496 Equations 等式(二分+暴力,技巧)
    HDU 2577 How to Type (DP,经典)
    HDU 1247 Hat’s Words (字符串匹配,暴力)
    HDU 1548 A strange lift 奇怪的电梯(BFS,水)
    HDU 1711 Number Sequence (数字KMP,变形)
    204 Count Primes 计数质数
    203 Remove Linked List Elements 删除链表中的元素
    202 Happy Number 快乐数
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/8818791.html
Copyright © 2020-2023  润新知