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

时间:2022-11-01 15:55:36
很简单的一段代码,非常奇怪,请帮忙调试下,看看效果..
一个对话框应用程序,两个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中打开文件时就会失败...

25 个解决方案

#1


./config.ini
------------>
.\config.ini

#2


引用 1 楼 flyskytoday 的回复:
./config.ini
------------>
.\config.ini

打开文件时,文件都存在,路径也正确的,你这样写反而错了...
直接单击button2打开文件不会失败,当你单击了button1,同时用到了CFileDialog和CFile,然后再单击button2,此时打开原来的文件就失败了..不知是哪出了问题

#3


打开失败,原因,第一次打开Cfile的成员变量m_strFileName为第一次获得的位图路径导致

#4


没关闭再打开就有问题啊!

新软件介绍

一些效果图:

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

#5


不好意思,经测试
你第二个按钮必须要获取绝对路径

刚刚的回答是不正确的

#6


引用 3 楼 yuhudie203 的回复:
打开失败,原因,第一次打开Cfile的成员变量m_strFileName为第一次获得的位图路径导致

能说明白点吗?
两个函数里的CFile file是两个不同的对象啊,怎么会互相受影响呢?
m_strFileName是static的??

#7


引用 4 楼 eossoe 的回复:
没关闭再打开就有问题啊!

新软件介绍

一些效果图:

非常感谢您提供的关于GIS方面的资料,我们打算自己写库来开发GIS系统,如果有需要您的软件,一定与您联系.

#8


原因找到了 
第一次为C:\Documents and Settings\zhaolei505622\My Documents\图片\7.bmp
第二次为C:\Documents and Settings\zhaolei505622\My Documents\图片\config.ini

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

#9


应该是第一次打开后,默认的路径就变成上一次的路径
再次打开时,就认为是找上一次目录下的config.ini

我测试了,事实就是这样的
要是换成绝对路径就没问题
CFile file;
    //随便打个一个文件
if(!file.Open("D:\\config.ini", CFile::modeRead)) 
{
    AfxMessageBox("open failed");
    return;
}
//然后关闭
file.Close();

#10


引用 5 楼 flyskytoday 的回复:
不好意思,经测试
你第二个按钮必须要获取绝对路径

刚刚的回答是不正确的

为什么相对路径就会失败了呢?

#11


呵呵

#12


引用 8 楼 yuhudie203 的回复:
原因找到了
第一次为C:\Documents and Settings\zhaolei505622\My Documents\图片\7.bmp
第二次为C:\Documents and Settings\zhaolei505622\My Documents\图片\config.ini

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

该怎么做,才能让它恢复到初始状态呢?

#13


引用 12 楼 lizhigang34 的回复:
引用 8 楼 yuhudie203 的回复:
原因找到了
第一次为C:\Documents and Settings\zhaolei505622\My Documents\图片\7.bmp
第二次为C:\Documents and Settings\zhaolei505622\My Documents\图片\config.ini

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

该怎么做,才能让它恢复到初始状态呢?

打开你程序路径下的一个文件 可以什么都不做比如a.txt不过前面要加上绝对路径

#14


那你这样做好了
加一个全局变量
CString CurrFilePath;
初始化中
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
CurrFilePath=path;

以后要用到当前程序下的相对文件位置
直接加上就行了
CurrFilePath+"\\config.ini"

#15


刚刚回答了第12L问题

10L问题
很显然,相对路径的位置变了,相对上一次打开文件的路径目录下没有config.ini文件,所以不正确。
就好象附件中的记事本一样,都有记忆最后一次打开文件路径功能

#16


这是一个需要记住的问题
CFileDialog每次打开会改变程序的当前目录,因而对于相对路径的操作,就会有影响
因而比较好的做法都是对于文件路径操作等,应该使用完整路径

#17


可以在CFileDialog打开前用GetCurrentDirectory获取当前目录
当CFileDialog关闭后再用SetCurrentDirectory还原
这样就不会影响相对路径了吧

#18


相对路径不行是当前目录改变了.........一般还是要用绝对路径放心,除非是放在本目录下面的................

#19


把第二个设置为绝对路径就好了 
第二个文件拷贝到第一个文件的里面

#20


有时候找不到原因就看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;

根据错误提示基本可以确定什么类型的错误.

#21


引用 16 楼 oyljerry 的回复:
这是一个需要记住的问题
CFileDialog每次打开会改变程序的当前目录,因而对于相对路径的操作,就会有影响
因而比较好的做法都是对于文件路径操作等,应该使用完整路径

up
这个才是正解

#22


学习

#23


使用绝对路径还是保险点,尤其是那些会影响路径的操作

#24


学习了,我也碰到了相似的问题,我搞了一个礼拜都没解决,终于在这找到了答案了,谢谢各位大虾
我的问题是这样的,要在一个菜单中打开一幅位图,使用CFileDialog,然后又要在另一个菜单中打开一个数据文件if(cf1.Open("mydata.dat",CFile::modeRead)==NULL)
结果当先打开后一个文件时没问题,当先打开位图后再来打开这个文件就打不开了,所以感觉很奇怪,搞了一个礼拜都没发现问题在哪,现在终于可以交差了,谢谢各位!

#25


引用 17 楼 greatsong 的回复:
可以在CFileDialog打开前用GetCurrentDirectory获取当前目录
当CFileDialog关闭后再用SetCurrentDirectory还原
这样就不会影响相对路径了吧

可行~

#1


./config.ini
------------>
.\config.ini

#2


引用 1 楼 flyskytoday 的回复:
./config.ini
------------>
.\config.ini

打开文件时,文件都存在,路径也正确的,你这样写反而错了...
直接单击button2打开文件不会失败,当你单击了button1,同时用到了CFileDialog和CFile,然后再单击button2,此时打开原来的文件就失败了..不知是哪出了问题

#3


打开失败,原因,第一次打开Cfile的成员变量m_strFileName为第一次获得的位图路径导致

#4


没关闭再打开就有问题啊!

新软件介绍

一些效果图:

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

#5


不好意思,经测试
你第二个按钮必须要获取绝对路径

刚刚的回答是不正确的

#6


引用 3 楼 yuhudie203 的回复:
打开失败,原因,第一次打开Cfile的成员变量m_strFileName为第一次获得的位图路径导致

能说明白点吗?
两个函数里的CFile file是两个不同的对象啊,怎么会互相受影响呢?
m_strFileName是static的??

#7


引用 4 楼 eossoe 的回复:
没关闭再打开就有问题啊!

新软件介绍

一些效果图:

非常感谢您提供的关于GIS方面的资料,我们打算自己写库来开发GIS系统,如果有需要您的软件,一定与您联系.

#8


原因找到了 
第一次为C:\Documents and Settings\zhaolei505622\My Documents\图片\7.bmp
第二次为C:\Documents and Settings\zhaolei505622\My Documents\图片\config.ini

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

#9


应该是第一次打开后,默认的路径就变成上一次的路径
再次打开时,就认为是找上一次目录下的config.ini

我测试了,事实就是这样的
要是换成绝对路径就没问题
CFile file;
    //随便打个一个文件
if(!file.Open("D:\\config.ini", CFile::modeRead)) 
{
    AfxMessageBox("open failed");
    return;
}
//然后关闭
file.Close();

#10


引用 5 楼 flyskytoday 的回复:
不好意思,经测试
你第二个按钮必须要获取绝对路径

刚刚的回答是不正确的

为什么相对路径就会失败了呢?

#11


呵呵

#12


引用 8 楼 yuhudie203 的回复:
原因找到了
第一次为C:\Documents and Settings\zhaolei505622\My Documents\图片\7.bmp
第二次为C:\Documents and Settings\zhaolei505622\My Documents\图片\config.ini

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

该怎么做,才能让它恢复到初始状态呢?

#13


引用 12 楼 lizhigang34 的回复:
引用 8 楼 yuhudie203 的回复:
原因找到了
第一次为C:\Documents and Settings\zhaolei505622\My Documents\图片\7.bmp
第二次为C:\Documents and Settings\zhaolei505622\My Documents\图片\config.ini

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

该怎么做,才能让它恢复到初始状态呢?

打开你程序路径下的一个文件 可以什么都不做比如a.txt不过前面要加上绝对路径

#14


那你这样做好了
加一个全局变量
CString CurrFilePath;
初始化中
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
CurrFilePath=path;

以后要用到当前程序下的相对文件位置
直接加上就行了
CurrFilePath+"\\config.ini"

#15


刚刚回答了第12L问题

10L问题
很显然,相对路径的位置变了,相对上一次打开文件的路径目录下没有config.ini文件,所以不正确。
就好象附件中的记事本一样,都有记忆最后一次打开文件路径功能

#16


这是一个需要记住的问题
CFileDialog每次打开会改变程序的当前目录,因而对于相对路径的操作,就会有影响
因而比较好的做法都是对于文件路径操作等,应该使用完整路径

#17


可以在CFileDialog打开前用GetCurrentDirectory获取当前目录
当CFileDialog关闭后再用SetCurrentDirectory还原
这样就不会影响相对路径了吧

#18


相对路径不行是当前目录改变了.........一般还是要用绝对路径放心,除非是放在本目录下面的................

#19


把第二个设置为绝对路径就好了 
第二个文件拷贝到第一个文件的里面

#20


有时候找不到原因就看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;

根据错误提示基本可以确定什么类型的错误.

#21


引用 16 楼 oyljerry 的回复:
这是一个需要记住的问题
CFileDialog每次打开会改变程序的当前目录,因而对于相对路径的操作,就会有影响
因而比较好的做法都是对于文件路径操作等,应该使用完整路径

up
这个才是正解

#22


学习

#23


使用绝对路径还是保险点,尤其是那些会影响路径的操作

#24


学习了,我也碰到了相似的问题,我搞了一个礼拜都没解决,终于在这找到了答案了,谢谢各位大虾
我的问题是这样的,要在一个菜单中打开一幅位图,使用CFileDialog,然后又要在另一个菜单中打开一个数据文件if(cf1.Open("mydata.dat",CFile::modeRead)==NULL)
结果当先打开后一个文件时没问题,当先打开位图后再来打开这个文件就打不开了,所以感觉很奇怪,搞了一个礼拜都没发现问题在哪,现在终于可以交差了,谢谢各位!

#25


引用 17 楼 greatsong 的回复:
可以在CFileDialog打开前用GetCurrentDirectory获取当前目录
当CFileDialog关闭后再用SetCurrentDirectory还原
这样就不会影响相对路径了吧

可行~