创建目录 得到当前程序目录

创建多级目录,很有用的代码:


// 判断目录是否存在    
BOOL  FolderExists(CString s)    
{    
      DWORD attr;     
      attr = GetFileAttributes(s);     
      return (attr != (DWORD)(-1) ) &&    
            ( attr & FILE_ATTRIBUTE_DIRECTORY);     

BOOL  CreateMuliteDirectory(CString P)    
{    
      int len=P.GetLength();    
      if ( len <2 ) return false;     
      if('\\'==P[len-1])  
      {  
            P=P.Left(len-1);  
            len=P.GetLength();  
      }  
      if ( len <=0 ) return false;  
      if (len <=3)    
      {  
            if (FolderExists(P))return true;  
            else return false;    
      }  
      if (FolderExists(P))return true;  
      CString Parent;  
      Parent=P.Left(P.ReverseFind('\\') );    
      if(Parent.GetLength()<=0)return false;     
      BOOL Ret=CreateMuliteDirectory(Parent);     
      if(Ret)     
      {    
            SECURITY_ATTRIBUTES sa;    
            sa.nLength=sizeof(SECURITY_ATTRIBUTES);    
            sa.lpSecurityDescriptor=NULL;    
            sa.bInheritHandle=0;    
            Ret=(CreateDirectory(P,&sa)==TRUE);    
            return Ret;    
      }    
      else  
return FALSE;    
}

调用
void CDirXXXDlg::OnXXX() 
{
// TODO: Add your control notification handler code here
char szDir[MAX_PATH] = _T("D:\\DirRoot\\Dir1\\Dir2");
BOOL bRet = CreateMuliteDirectory(szDir);
}

还有另一种逐级别创建目录的方法,但是好像没有成功。但是也总结如下,以便今后进一步的学习与研究:

    //方法一 外壳函数,最少也要Windows2000才行 
     WCHAR  pszwPath[260] = {0};
     MultiByteToWideChar(CP_ACP, 0,
         pszPath,  strlen (pszPath)+1, pszwPath, 256);
     int  ret = SHCreateDirectory(NULL, pszwPath);
               
     if ( ret==ERR_SUCCEED || ret==ERROR_FILE_EXISTS || ret==ERROR_ALREADY_EXISTS)
         return  TRUE;
     else
         return  FALSE;
         //方法二  WINDOWS API 用了STL string
     string strFullPath = pszPath;
     string strTmp;
     int  pos = 0, last_pos = 0;
     while (pos != -1)
     {
         pos = strFullPath.find_first_of( '\\' , last_pos);
         if ( pos != -1 /*npos*/  )
         {
             strTmp.assign(strFullPath, 0, pos);
             //目录不存在则创建之
             if ( !IsPathExist(strTmp.c_str()) )
                 CreateDirectory(strTmp.c_str(), NULL);
 
             last_pos = pos+1;
         }
         else
         {
             if ( (strFullPath.size() - last_pos ) > 0)
             {
                 if ( !IsPathExist(strFullPath.c_str()) )
                     CreateDirectory(strFullPath.c_str(), NULL);
                 
                 last_pos = pos+1;
             }
             break ;
         }
     }


MFC程序得到本身路径

在开发工程中,往往需要知道当前程序本身所在目录。
一种方法是在程序安装的时候利用安装程序把文件路径写入注册表。在较大的程序中,这种方法比较常用
另一种,就是在程序得到路径。这样,程序随便移动到哪里,都可以得到正确的路径。这也是本文介绍的方法。

并且经本人测试,当把文件打包成安装包后,此路径会自动指向安装包路径,很是不错!

方法一:
[code]
//得到帮助文件的路径
CString strFullName = AfxGetApp()->m_pszHelpFilePath;
//得到的是:X:\XXXX\XXX.hlp

//解析路径,得到当前运行程序所在目录
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];

_splitpath(strAppName, drive, dir, NULL,NULL);
CString strPath;
strPath.Format("%s%s", drive, dir);


//strPath即为得到的当前运行程序所在目录
[/code]
另外,AfxGetApp()->m_pszAppName 得到应用程序名称
AfxGetApp()->m_pszExeName 得到程序文件名,不包括扩展名

方法二:
得到全路径
TCHAR exeFullPath[MAX_PATH]; // MAX_PATH
GetModuleFileName(NULL,exeFullPath,MAX_PATH);//得到程序模块名称,全路径
也就是当前运行程序的全路径
利用方法一的解析路径的方法,即可得到程序所在路径。

GetModuleFileName函数原型
DWORD GetModuleFileName(
   HMODULE hModule,     // handle to module。将要得到的模块的句柄。如果是当前模块,NULL
   LPTSTR lpFilename,   // path buffer   得到的文件名。
   DWORD nSize          // size of buffer   一般MAX_PATH就可以了

 

(PS:个人实现过,能成功,感谢原作者文章对我的帮助
http://blog.sina.com.cn/s/blog_4b7c6cc00100t7j2.html
http://blog.sina.com.cn/s/blog_8a7012cf01014ts0.html
http://blog.chinaunix.net/uid-21768364-id-3244467.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值