一个对话框应用程序,两个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
------------>
.\config.ini
#2
打开文件时,文件都存在,路径也正确的,你这样写反而错了...
直接单击button2打开文件不会失败,当你单击了button1,同时用到了CFileDialog和CFile,然后再单击button2,此时打开原来的文件就失败了..不知是哪出了问题
#3
打开失败,原因,第一次打开Cfile的成员变量m_strFileName为第一次获得的位图路径导致
#5
不好意思,经测试
你第二个按钮必须要获取绝对路径
刚刚的回答是不正确的
你第二个按钮必须要获取绝对路径
刚刚的回答是不正确的
#6
能说明白点吗?
两个函数里的CFile file是两个不同的对象啊,怎么会互相受影响呢?
m_strFileName是static的??
#7
非常感谢您提供的关于GIS方面的资料,我们打算自己写库来开发GIS系统,如果有需要您的软件,一定与您联系.
#8
原因找到了
第一次为C:\Documents and Settings\zhaolei505622\My Documents\图片\7.bmp
第二次为C:\Documents and Settings\zhaolei505622\My Documents\图片\config.ini
第一次打开的位图文件改变了相对路径的文件夹 所以在第二次打开时config.ini的文件夹为图片的
导致失败 可以获得绝对路径来打开文件
第一次为C:\Documents and Settings\zhaolei505622\My Documents\图片\7.bmp
第二次为C:\Documents and Settings\zhaolei505622\My Documents\图片\config.ini
第一次打开的位图文件改变了相对路径的文件夹 所以在第二次打开时config.ini的文件夹为图片的
导致失败 可以获得绝对路径来打开文件
#9
应该是第一次打开后,默认的路径就变成上一次的路径
再次打开时,就认为是找上一次目录下的config.ini
我测试了,事实就是这样的
要是换成绝对路径就没问题
再次打开时,就认为是找上一次目录下的config.ini
我测试了,事实就是这样的
要是换成绝对路径就没问题
CFile file;
//随便打个一个文件
if(!file.Open("D:\\config.ini", CFile::modeRead))
{
AfxMessageBox("open failed");
return;
}
//然后关闭
file.Close();
#10
为什么相对路径就会失败了呢?
#11
呵呵
#12
该怎么做,才能让它恢复到初始状态呢?
#13
打开你程序路径下的一个文件 可以什么都不做比如a.txt不过前面要加上绝对路径
#14
那你这样做好了
加一个全局变量
CString CurrFilePath;
初始化中
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
CurrFilePath=path;
以后要用到当前程序下的相对文件位置
直接加上就行了
CurrFilePath+"\\config.ini"
加一个全局变量
CString CurrFilePath;
初始化中
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
CurrFilePath=path;
以后要用到当前程序下的相对文件位置
直接加上就行了
CurrFilePath+"\\config.ini"
#15
刚刚回答了第12L问题
10L问题
很显然,相对路径的位置变了,相对上一次打开文件的路径目录下没有config.ini文件,所以不正确。
就好象附件中的记事本一样,都有记忆最后一次打开文件路径功能
10L问题
很显然,相对路径的位置变了,相对上一次打开文件的路径目录下没有config.ini文件,所以不正确。
就好象附件中的记事本一样,都有记忆最后一次打开文件路径功能
#16
这是一个需要记住的问题
CFileDialog每次打开会改变程序的当前目录,因而对于相对路径的操作,就会有影响
因而比较好的做法都是对于文件路径操作等,应该使用完整路径
CFileDialog每次打开会改变程序的当前目录,因而对于相对路径的操作,就会有影响
因而比较好的做法都是对于文件路径操作等,应该使用完整路径
#17
可以在CFileDialog打开前用GetCurrentDirectory获取当前目录
当CFileDialog关闭后再用SetCurrentDirectory还原
这样就不会影响相对路径了吧
当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
up
这个才是正解
#22
学习
#23
使用绝对路径还是保险点,尤其是那些会影响路径的操作
#24
学习了,我也碰到了相似的问题,我搞了一个礼拜都没解决,终于在这找到了答案了,谢谢各位大虾
我的问题是这样的,要在一个菜单中打开一幅位图,使用CFileDialog,然后又要在另一个菜单中打开一个数据文件if(cf1.Open("mydata.dat",CFile::modeRead)==NULL)
结果当先打开后一个文件时没问题,当先打开位图后再来打开这个文件就打不开了,所以感觉很奇怪,搞了一个礼拜都没发现问题在哪,现在终于可以交差了,谢谢各位!
我的问题是这样的,要在一个菜单中打开一幅位图,使用CFileDialog,然后又要在另一个菜单中打开一个数据文件if(cf1.Open("mydata.dat",CFile::modeRead)==NULL)
结果当先打开后一个文件时没问题,当先打开位图后再来打开这个文件就打不开了,所以感觉很奇怪,搞了一个礼拜都没发现问题在哪,现在终于可以交差了,谢谢各位!
#25
可行~
#1
./config.ini
------------>
.\config.ini
------------>
.\config.ini
#2
打开文件时,文件都存在,路径也正确的,你这样写反而错了...
直接单击button2打开文件不会失败,当你单击了button1,同时用到了CFileDialog和CFile,然后再单击button2,此时打开原来的文件就失败了..不知是哪出了问题
#3
打开失败,原因,第一次打开Cfile的成员变量m_strFileName为第一次获得的位图路径导致
#4
#5
不好意思,经测试
你第二个按钮必须要获取绝对路径
刚刚的回答是不正确的
你第二个按钮必须要获取绝对路径
刚刚的回答是不正确的
#6
能说明白点吗?
两个函数里的CFile file是两个不同的对象啊,怎么会互相受影响呢?
m_strFileName是static的??
#7
非常感谢您提供的关于GIS方面的资料,我们打算自己写库来开发GIS系统,如果有需要您的软件,一定与您联系.
#8
原因找到了
第一次为C:\Documents and Settings\zhaolei505622\My Documents\图片\7.bmp
第二次为C:\Documents and Settings\zhaolei505622\My Documents\图片\config.ini
第一次打开的位图文件改变了相对路径的文件夹 所以在第二次打开时config.ini的文件夹为图片的
导致失败 可以获得绝对路径来打开文件
第一次为C:\Documents and Settings\zhaolei505622\My Documents\图片\7.bmp
第二次为C:\Documents and Settings\zhaolei505622\My Documents\图片\config.ini
第一次打开的位图文件改变了相对路径的文件夹 所以在第二次打开时config.ini的文件夹为图片的
导致失败 可以获得绝对路径来打开文件
#9
应该是第一次打开后,默认的路径就变成上一次的路径
再次打开时,就认为是找上一次目录下的config.ini
我测试了,事实就是这样的
要是换成绝对路径就没问题
再次打开时,就认为是找上一次目录下的config.ini
我测试了,事实就是这样的
要是换成绝对路径就没问题
CFile file;
//随便打个一个文件
if(!file.Open("D:\\config.ini", CFile::modeRead))
{
AfxMessageBox("open failed");
return;
}
//然后关闭
file.Close();
#10
为什么相对路径就会失败了呢?
#11
呵呵
#12
该怎么做,才能让它恢复到初始状态呢?
#13
打开你程序路径下的一个文件 可以什么都不做比如a.txt不过前面要加上绝对路径
#14
那你这样做好了
加一个全局变量
CString CurrFilePath;
初始化中
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
CurrFilePath=path;
以后要用到当前程序下的相对文件位置
直接加上就行了
CurrFilePath+"\\config.ini"
加一个全局变量
CString CurrFilePath;
初始化中
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
CurrFilePath=path;
以后要用到当前程序下的相对文件位置
直接加上就行了
CurrFilePath+"\\config.ini"
#15
刚刚回答了第12L问题
10L问题
很显然,相对路径的位置变了,相对上一次打开文件的路径目录下没有config.ini文件,所以不正确。
就好象附件中的记事本一样,都有记忆最后一次打开文件路径功能
10L问题
很显然,相对路径的位置变了,相对上一次打开文件的路径目录下没有config.ini文件,所以不正确。
就好象附件中的记事本一样,都有记忆最后一次打开文件路径功能
#16
这是一个需要记住的问题
CFileDialog每次打开会改变程序的当前目录,因而对于相对路径的操作,就会有影响
因而比较好的做法都是对于文件路径操作等,应该使用完整路径
CFileDialog每次打开会改变程序的当前目录,因而对于相对路径的操作,就会有影响
因而比较好的做法都是对于文件路径操作等,应该使用完整路径
#17
可以在CFileDialog打开前用GetCurrentDirectory获取当前目录
当CFileDialog关闭后再用SetCurrentDirectory还原
这样就不会影响相对路径了吧
当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
up
这个才是正解
#22
学习
#23
使用绝对路径还是保险点,尤其是那些会影响路径的操作
#24
学习了,我也碰到了相似的问题,我搞了一个礼拜都没解决,终于在这找到了答案了,谢谢各位大虾
我的问题是这样的,要在一个菜单中打开一幅位图,使用CFileDialog,然后又要在另一个菜单中打开一个数据文件if(cf1.Open("mydata.dat",CFile::modeRead)==NULL)
结果当先打开后一个文件时没问题,当先打开位图后再来打开这个文件就打不开了,所以感觉很奇怪,搞了一个礼拜都没发现问题在哪,现在终于可以交差了,谢谢各位!
我的问题是这样的,要在一个菜单中打开一幅位图,使用CFileDialog,然后又要在另一个菜单中打开一个数据文件if(cf1.Open("mydata.dat",CFile::modeRead)==NULL)
结果当先打开后一个文件时没问题,当先打开位图后再来打开这个文件就打不开了,所以感觉很奇怪,搞了一个礼拜都没发现问题在哪,现在终于可以交差了,谢谢各位!
#25
可行~