奇怪的CreateFile

GrimAngel 2009-11-19 10:12:31
我在编程时遇到了一个很奇怪的问题,如果你调用一次浏览器,你会CreateFile失败,哈哈,不相的话你可以试下,下面的是我的代码,其中Targetway()就是弹出浏览器的,你如果不调用浏览器,直接按Button1可以生成文件,但你按了浏览按钮后,再按Button1就不能生成了,唉。。。我也想知这是为什么啊。。

如果要源码可以到这里拿
www.126.com
帐号:CSDNtest1
密码:CSDNtest

#define NAMEBUF 1024//这个是全局的
CString F1path;//在.h中定义
CString F2path;//在.h中定义

void CMy2Dlg::OnButton1()
{
CString sz1="0;1;34;23;67;54;9;3";
char *sz = sz1.GetBuffer(sz1.GetLength());
DWORD dw;
HANDLE hFile=CreateFile("n.html",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
WriteFile(hFile,sz,strlen(sz)+1,&dw,NULL);
CloseHandle(hFile);

CString MeTelephone="",MePassword="";
GetDlgItem(IDC_MeTelephone)->GetWindowText(MeTelephone);
GetDlgItem(IDC_MePassword)->GetWindowText(MePassword);
SelectDlg dlg;
if(F1path=="" || F2path=="" || MeTelephone=="" || MePassword=="")
MessageBox("需要的信息还没填完整喔!");
else
{
if(IDOK==dlg.DoModal())
{
MessageBox("OK");
}
}
}

void CMy2Dlg::OnButton2()
{
Targetway(1);//弹出文件浏览器
//F1path="c:\\1.xls";
GetDlgItem(IDC_Test1)->SetWindowText(F1path);//使Text文件框显示出文件的地址
}

void CMy2Dlg::OnButton3()
{
Targetway(2);//弹出文件浏览器
//F2path="c:\\2.xls";
GetDlgItem(IDC_Test2)->SetWindowText(F2path);//使Text文件框显示出文件的地址
}

void CMy2Dlg::Targetway(int FileNumber)
{
::CFileDialog File(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("Excel(*.xls)(*.csv)|*.xls;*.csv|"),GetParent());
File.m_ofn.lpstrFile = new TCHAR[NAMEBUF]; // 重新定义缓冲区大小
memset(File.m_ofn.lpstrFile,0,NAMEBUF); // 初始化定义的缓冲
File.m_ofn.nMaxFile = NAMEBUF; //重新定义文件地址的长度。

CString pathName;
if(File.DoModal() == IDOK)
{
POSITION pos = File.GetStartPosition();
while(pos != NULL)
{
pathName = File.GetNextPathName(pos);
}
}
else
{
MessageBox("取消了");
}
if(FileNumber==1)//判断文件是成绩xls还是飞信csv
F1path = File.GetPathName();//保存成绩xls地址
else
F2path = File.GetPathName();//保存飞信csv地址
delete [] File.m_ofn.lpstrFile;
}
...全文
174 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
MoXiaoRab 2009-11-19
  • 打赏
  • 举报
回复
完全没关系的东西啊
用户 昵称 2009-11-19
  • 打赏
  • 举报
回复
文件摆了
-----------
还以为文件摆是一个新名词。
GrimAngel 2009-11-19
  • 打赏
  • 举报
回复
呵呵。。真希望高手可以回答到。。。
fishion 2009-11-19
  • 打赏
  • 举报
回复
还真奇怪呀,为啥了
GrimAngel 2009-11-19
  • 打赏
  • 举报
回复
没什么关系的。。就是调用了浏览器后不能生成文件摆了。。至于楼上说我没搜以前的贴嘛。。我就是说。。可以生成文件的。。只是调用了浏览器后不能生成摆了。
Dingnifei123 2009-11-19
  • 打赏
  • 举报
回复
兄弟,先看看MSDN吧,输入CreateFile,
要不就搜一下CSDN以前的帖子,
MoXiaoRab 2009-11-19
  • 打赏
  • 举报
回复
2个xls关那个html什么事情啊
GrimAngel 2009-11-19
  • 打赏
  • 举报
回复
还有2楼的Share选项我还是不太明白。。
GrimAngel 2009-11-19
  • 打赏
  • 举报
回复
Button2或者Button3都是可以达到生成文件无效化。。
healer_kx 2009-11-19
  • 打赏
  • 举报
回复
就是参数的问题,多试几次就行了,我年轻的时候,可不会为这种问题浪费我的分哦,接分。。。
huziwu 2009-11-19
  • 打赏
  • 举报
回复
在CreateFile加入Share选项试过了吗?
MoXiaoRab 2009-11-19
  • 打赏
  • 举报
回复
哪个是浏览按钮?button2还是3
GrimAngel 2009-11-19
  • 打赏
  • 举报
回复
我终于完成了。。谢谢各位高手帮忙了喔。
GrimAngel 2009-11-19
  • 打赏
  • 举报
回复
楼上的。。我是菜鸟。。请问。。如何取得当前EXE的绝对路径。。。。
vcTiro 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 grimangel 的回复:]
17楼的人兄。。可以教下我怎么改回来。。或者CreateFile时使用绝对路径呢?
[/Quote]
		memset(m_file, 0, sizeof(m_file));
::GetModuleFileName(NULL, m_file, sizeof(m_file) / sizeof(m_file[0]));

m_file中就是你EXE的绝对路径,然后你再用字符串函数拼成一个文件的绝对路径就可以了,这个就代表在你EXE的同目录下创建的文件。22楼的方法不太可取,建议别用(不好意思了,22楼的兄弟)
如你取得当前EXE的绝对路径后,用下面的方法生成与EXE同路径的“n.html”文件:
strcpy(strrchr(m_file, '\\'), "\\n.html");

然后再把它传入到CreateFile的参数中去。
MoXiaoRab 2009-11-19
  • 打赏
  • 举报
回复
那你用绝对路径好了呀,把FileDialog的路径保存下来,剪掉最后的文件名,和你的html文件名拼接起来

不过,这样其实不爽

可以用SetCurrentDirectory来修正当前文件夹
GrimAngel 2009-11-19
  • 打赏
  • 举报
回复
17楼的人兄。。可以教下我怎么改回来。。或者CreateFile时使用绝对路径呢?
GrimAngel 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 vctiro 的回复:]
引用 16 楼 grimangel 的回复:
嗯。。是有关系的。。但我不能把源代码全部放出来。。只能放这些。。就是导致不能使用CreateFile的情况。。调用了浏览器后不能使用CreateFile


这种问题,其实会用GetLastError()就可以解决了。有什么奇怪的呢?

另:你的文件不是没有创建,而在在其它地方去了!去你浏览文件对话框的路径看看!记住一点:你用的是相对地址,而浏览文件对话框是会更改程序当前的工作路径的。
[/Quote]
唉。。终于等到正确的答案了。。谢谢你了喔。。
fishion 2009-11-19
  • 打赏
  • 举报
回复
原来在其它地方也有,看来是路径的问题了
fishion 2009-11-19
  • 打赏
  • 举报
回复
原来都创建到“我的文档”里去了
加载更多回复(5)

16,551

社区成员

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

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

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