posts - 131, comments - 12, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

CFileDialog 打开当前目录

Posted on 2013-01-14 14:57 盛胜 阅读(4415) 评论(0)  编辑 收藏 引用

http://hi.baidu.com/xiao%BF%D5%BF%D5/blog/item/3c418716a6cadf12962b4344.html

CFileDialog打开当前路径

TCHAR Buffer[size];

GetCurrentDirectory(size, Buffer);

CFileDialog dlg(true,"*BIN",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "二进制文件(*.BIN)|*.bin|All Files (*.*)|*.*|",NULL); 
dlg.m_ofn.lpstrInitialDir=Buffer;

if(dlg.DoModal())

{

//your code;

}

 

========================

http://hi.baidu.com/g168999/blog/item/9ef3ab517977f1571038c2ba.html

VC获取当前程序文件的路径,文件名以及路径2种方法对比建议
2010-01-01 13:49

1.方法1

   char pBuf[MAX_PATH];                                               //存放路径的变量
   GetCurrentDirectory(MAX_PATH,pBuf);                   //获取程序的当前目录
   strcat(pBuf,"//");
   strcat(pBuf,AfxGetApp()->m_pszExeName);   
   strcat(pBuf,".exe");                                                       //获取程序的全文件名

2.方法2

   //函数返回应用程序所在的路径  

   CString    CClientApp::ReturnPath()  

   {   
   CString    sPath;   
   GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);   
   sPath.ReleaseBuffer    ();   
   int    nPos;   
   nPos=sPath.ReverseFind('//');   
   sPath=sPath.Left(nPos);   
   return    sPath;   
   }

3.对比及建议

方法1获取的是程序的工作路径,如某个程序安装在C,D盘或者其它任何,当你从[开始]-[程序]后的菜单中打开该文件,此时获取的是用户工作路径,如:C:/Documents and Settings/[计算机当前用户名]/....../....
如果你想通过这个路径来加载你放在程序目录下的文件,必定出错。通常这种情况在你编译调试程序时是不会出错的,你跟踪得到的绝对路径,但打包安装后一定出问题。

方法2获取的是程序的绝对路径,用这个路径加载同目录下的文件是不会有问题的。

如果你要确保成功加载文件,建议使用方法2!!!!!!


新建目录CreateDirectory

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

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

  1. CString szDir;  
  2. szDir="C:\\temp";//临时文件夹  
  3. DWORD dwAttr=GetFileAttributes(szDir);  
  4. if(dwAttr==0xFFFFFFFF)  //临时文件夹不存在则创建  
  5. {  
  6.     CreateDirectory(szDir,NULL);  
  7. )  
  8. //.........chuli  
  9. 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


  
  1. #include <windows.h>  
  2.   #include <stdio.h>  
  3.   BOOL CreateSampleService()  
  4.   {  
  5.   TCHAR szPath[MAX_PATH];  
  6.   if( !GetModuleFileName( NULL, szPath, MAX_PATH ) )  
  7.   {  
  8.   printf("GetModuleFileName failed (%d)\n", GetLastError());  
  9.   return FALSE;  
  10.   }  
  11.   return TRUE;  
  12.   }  
  1. <h1><a name="t2"></a>获取程序当前路径GetCurrentDirectory(当前进程的当前路径,即程序实例目录,会随着操作的改变而改变)</h1>DWORD GetCurrentDirectory(  
  2.   DWORD nBufferLength, // size of directory buffer  
  3.   LPTSTR lpBuffer // directory buffer  
  4.   );  

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

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

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

  1. CFileDialog Dlg(TRUE,NULL,NULL,0,"ASCII Data Files(*.asc)|*.asc|所有文件 (*.*)|*.*||");  
  2.     char pBuf[MAX_PATH];                                 //存放路径的变量         
  3.       
  4.     GetCurrentDirectory(MAX_PATH,pBuf);                   //获取程序的当前目录  
  5.       
  6.     strcat(pBuf,"\\");  
  7.       
  8.     CString strtemp=pBuf;  
  9.       
  10.   
  11.     Dlg.m_ofn.lpstrInitialDir=pBuf; 


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理