CFileDialog与CFile使用后,再用CFile::Open文件,一直失败

lizhigang34 2009-09-12 02:38:05
很简单的一段代码,非常奇怪,请帮忙调试下,看看效果..
一个对话框应用程序,两个BUTTON: button1,button2
//下面是按下button1时的代码,用CFileDialog选择一个文件,用CFile打开它(仅仅打开而已)

void CFileTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码

//
CFileDialog FileDialog(FALSE, "bmp", NULL, NULL,
"Group Files (*.bmp)|", this);
if (FileDialog.DoModal() == IDCANCEL)
return ;
//得到路径
CString strFilePath = FileDialog.GetPathName();

//打开文件
CFile file;
if(!file.Open(strFilePath, CFile::modeRead))
{
AfxMessageBox("create group file failed,error at CChuangShiMgr::createGroup()");
return;
}
//关闭文件
file.Close();

}

然后在button2的click事件中,我打开另一个文件,同样仅是打开而已

void CFileTestDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码

CFile file;
//随便打个一个文件
if(!file.Open("./config.ini", CFile::modeRead))
{
AfxMessageBox("open failed");
return;
}
//然后关闭
file.Close();
}

这些文件都是存在的,路径也正确;当你单击button1后再单击button2,这样在button2中打开文件时就会失败...
...全文
513 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
行胜于言々 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 greatsong 的回复:]

可以在CFileDialog打开前用GetCurrentDirectory获取当前目录
当CFileDialog关闭后再用SetCurrentDirectory还原
这样就不会影响相对路径了吧
[/Quote]
可行~
Kevin2Yi 2010-04-04
  • 打赏
  • 举报
回复
学习了,我也碰到了相似的问题,我搞了一个礼拜都没解决,终于在这找到了答案了,谢谢各位大虾
我的问题是这样的,要在一个菜单中打开一幅位图,使用CFileDialog,然后又要在另一个菜单中打开一个数据文件if(cf1.Open("mydata.dat",CFile::modeRead)==NULL)
结果当先打开后一个文件时没问题,当先打开位图后再来打开这个文件就打不开了,所以感觉很奇怪,搞了一个礼拜都没发现问题在哪,现在终于可以交差了,谢谢各位!
ToBeTough 2009-09-13
  • 打赏
  • 举报
回复
学习
ToCpp 2009-09-13
  • 打赏
  • 举报
回复
使用绝对路径还是保险点,尤其是那些会影响路径的操作
Conry 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 oyljerry 的回复:]
这是一个需要记住的问题
CFileDialog每次打开会改变程序的当前目录,因而对于相对路径的操作,就会有影响
因而比较好的做法都是对于文件路径操作等,应该使用完整路径
[/Quote]
up
这个才是正解
zhugay 2009-09-12
  • 打赏
  • 举报
回复
有时候找不到原因就看GetLastError
BOOL displayerrormessage(void)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL );
// Process any inserts in lpMsgBuf.
// ...
// Display the string.
MessageBox(0,(LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
return true;

根据错误提示基本可以确定什么类型的错误.
lili0920 2009-09-12
  • 打赏
  • 举报
回复
把第二个设置为绝对路径就好了
第二个文件拷贝到第一个文件的里面
dirdirdir3 2009-09-12
  • 打赏
  • 举报
回复
相对路径不行是当前目录改变了.........一般还是要用绝对路径放心,除非是放在本目录下面的................
greatsong 2009-09-12
  • 打赏
  • 举报
回复
可以在CFileDialog打开前用GetCurrentDirectory获取当前目录
当CFileDialog关闭后再用SetCurrentDirectory还原
这样就不会影响相对路径了吧
oyljerry 2009-09-12
  • 打赏
  • 举报
回复
这是一个需要记住的问题
CFileDialog每次打开会改变程序的当前目录,因而对于相对路径的操作,就会有影响
因而比较好的做法都是对于文件路径操作等,应该使用完整路径
flyskytoday 2009-09-12
  • 打赏
  • 举报
回复
刚刚回答了第12L问题

10L问题
很显然,相对路径的位置变了,相对上一次打开文件的路径目录下没有config.ini文件,所以不正确。
就好象附件中的记事本一样,都有记忆最后一次打开文件路径功能
flyskytoday 2009-09-12
  • 打赏
  • 举报
回复
那你这样做好了
加一个全局变量
CString CurrFilePath;
初始化中
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
CurrFilePath=path;

以后要用到当前程序下的相对文件位置
直接加上就行了
CurrFilePath+"\\config.ini"
yuhudie203 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lizhigang34 的回复:]
引用 8 楼 yuhudie203 的回复:
原因找到了
第一次为C:\Documents and Settings\zhaolei505622\My Documents\图片\7.bmp
第二次为C:\Documents and Settings\zhaolei505622\My Documents\图片\config.ini

第一次打开的位图文件改变了相对路径的文件夹 所以在第二次打开时config.ini的文件夹为图片的
导致失败 可以获得绝对路径来打开文件

该怎么做,才能让它恢复到初始状态呢?
[/Quote]
打开你程序路径下的一个文件 可以什么都不做比如a.txt不过前面要加上绝对路径
lizhigang34 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yuhudie203 的回复:]
原因找到了
第一次为C:\Documents and Settings\zhaolei505622\My Documents\图片\7.bmp
第二次为C:\Documents and Settings\zhaolei505622\My Documents\图片\config.ini

第一次打开的位图文件改变了相对路径的文件夹 所以在第二次打开时config.ini的文件夹为图片的
导致失败 可以获得绝对路径来打开文件
[/Quote]
该怎么做,才能让它恢复到初始状态呢?
jyh_baoding 2009-09-12
  • 打赏
  • 举报
回复
呵呵
lizhigang34 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 flyskytoday 的回复:]
不好意思,经测试
你第二个按钮必须要获取绝对路径

刚刚的回答是不正确的
[/Quote]
为什么相对路径就会失败了呢?
flyskytoday 2009-09-12
  • 打赏
  • 举报
回复
应该是第一次打开后,默认的路径就变成上一次的路径
再次打开时,就认为是找上一次目录下的config.ini

我测试了,事实就是这样的
要是换成绝对路径就没问题
CFile file;
//随便打个一个文件
if(!file.Open("D:\\config.ini", CFile::modeRead))
{
AfxMessageBox("open failed");
return;
}
//然后关闭
file.Close();
yuhudie203 2009-09-12
  • 打赏
  • 举报
回复
原因找到了
第一次为C:\Documents and Settings\zhaolei505622\My Documents\图片\7.bmp
第二次为C:\Documents and Settings\zhaolei505622\My Documents\图片\config.ini

第一次打开的位图文件改变了相对路径的文件夹 所以在第二次打开时config.ini的文件夹为图片的
导致失败 可以获得绝对路径来打开文件
lizhigang34 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 eossoe 的回复:]
没关闭再打开就有问题啊!

新软件介绍

一些效果图:



[/Quote]
非常感谢您提供的关于GIS方面的资料,我们打算自己写库来开发GIS系统,如果有需要您的软件,一定与您联系.
lizhigang34 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yuhudie203 的回复:]
打开失败,原因,第一次打开Cfile的成员变量m_strFileName为第一次获得的位图路径导致
[/Quote]
能说明白点吗?
两个函数里的CFile file是两个不同的对象啊,怎么会互相受影响呢?
m_strFileName是static的??
加载更多回复(5)
CFile //创建/打开文件 CFile file; file.Open(_T("test.txt"),CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite); 文件打开模式可组合使用,用“|”隔开,常用的有以下几种: CFile::modeCreate:以新建方式打开,如果文件不存在,新建;如果文件已存在,把该文件长度置零,即清除文件原有内容。 CFile::modeNoTruncate:以追加方式打开,如果文件存在,打开并且不将文件长度置零,如果文件不存在,会抛出异常。一般与CFile::modeCreate一起使用,则文件不存在时,新建一个文件;存在就进行追加操作。 CFile::modeReadWrite:以读写方式打开文件。 CFile::modeRead:只读。 CFile::modeWrite:只写。 //写入数据 CString strValue = "Hello World!"; file.Write(strValue,strValue.GetLength()); //追加数据 file.SeekToEnd(); //将指针移至文件末尾进行追加 file.Write(strValue,strValue.GetLength()); //关闭文件 file.Close(); CStdioFile CStdioFile是CFile的派生类,对文件进行流式操作,对于文本文件的读写很有用处,可按行读取写入。 //写入数据 CString strValue = "Hello World!"; file.WriteString(strValue); //读取数据 CString strRead; file.ReadString(strRead); 当文件存在多行数据需要逐行读取时,可用函数BOOL CStdioFile::ReadString(CString& rString),当遇到"\n "时读取截断,如果文件未读完,返回true,否则返回false。 //逐行读取文件内容,存入strRead while(file.ReadString(strRead)) { ...; } 各种关于文件的操作在程序设计中是十分常见,如果能对其各种操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而在较短的时间内编写出高效的代码,因而熟练的掌握文件操作是十分重要的。本文将对Visual C++中有关文件操作进行全面的介绍,并对在文件操作中经常遇到的一些疑难问题进行详细的分析。   1.文件的查找   当对一个文件操作时,如果不知道该文件是否存在,就要首先进行查找。MFC中有一个专门用来进行文件查找的类CFileFind,使用它可以方便快捷地进行文件的查找。下面这段代码演示了这个类的最基本使用方法。   CString strFileTitle;   CFileFind finder;   BOOL bWorking = finder.FindFile("C:\\windows\\sysbkup\\*.cab");   while(bWorking)   {   bWorking=finder.FindNextFile();   strFileTitle=finder.GetFileTitle();   }   2.文件的打开/保存对话框   让用户选择文件进行打开和存储操作时,就要用到文件打开/保存对话框。MFC的类CFileDialog用于实现这种功能。使用CFileDialog声明一个对象时,第一个BOOL型参数用于指定文件的打开或保存,当为TRUE时将构造一个文件打开对话框,为FALSE时构造一个文件保存对话框。   在构造CFileDialog对象时,如果在参数中指定了OFN_ALLOWMULTISELECT风格,则在此对话框中可以进行多选操作。此时要重点注意为此CFileDialog对象的m_ofn.lpstrFile分配一块内存,用于存储多选操作所返回的所有文件路径名,如果不进行分配或分配的内存过小就会导致操作失败。下面这段程序演示了文件打开对话框的使用方法。   CFileDialog mFileDlg(TRUE,NULL,NULL,   OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,   "All Files (*.*)|*.*||",AfxGetMainWnd());   CString str(" ",10000);   mFileDlg.m_ofn.lpstrFile=str.GetBuffer(10000);   str

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧