"不能打开未命名文件"错误是什么意思?

yym314 2006-12-21 12:22:01
我一个MFC的dialog程序中,处理一个button的click事件时偶尔会跳出"不能打开未命名文件"这样的错误消息.在大多数机器上没有这个问题,只是在几个机器上会出现这个问题.why?
程序代码如下:

//其中SYSLOG是一个系统日志文件,m_lvFile是一个有3列的list view

void CFTClientDlg::OnBtnAdd()
{
CFileDialog dlg(TRUE,"","",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
"所有文件(*.*)|*.*|");

if(IDOK==dlg.DoModal())
{
CFile file;
CFileStatus filestatus;
CString strFilePath, strFileSize, strFileTime;
unsigned long lFileSize;
POSITION pos = dlg.GetStartPosition();

while (pos)
{
strFilePath = dlg.GetNextPathName(pos);

if( file.Open( strFilePath, CFile::modeRead|CFile::shareDenyNone ) <0 ||
file.GetStatus( filestatus) == false )
{
char strError[256];
_snprintf( strError, 255, "无法打开文件%s,请检查文件是否存在",strFilePath.GetBuffer(-1) );
SYSLOG.WriteLog( LOG_ERROR, strError );
MessageBox( strError, NULL, MB_OK|MB_ICONWARNING );
if( file.operator HFILE() != CFile::hFileNull )
file.Close();
continue;
}
lFileSize = file.GetLength();
strFileSize.Format("%d字节", lFileSize);

strFileTime = filestatus.m_mtime.Format("%Y%m%d %H:%M:%S");

int idx = m_lvFile.InsertItem( m_lvFile.GetItemCount(), strFilePath );
m_lvFile.SetItemText( idx, 1, strFileSize );
m_lvFile.SetItemText( idx, 2, strFileTime );

if( file.operator HFILE() != CFile::hFileNull )
file.Close();
}
}
}
...全文
777 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Juchiyufei 2007-01-17
  • 打赏
  • 举报
回复
接分快乐
:) ...
ReverseEngineering 2007-01-17
  • 打赏
  • 举报
回复
这样的怪事?关注。
yym314 2006-12-21
  • 打赏
  • 举报
回复
恩!按照大家的说法做了!
还是老问题!
qiujian5628 2006-12-21
  • 打赏
  • 举报
回复
在你的dlg.DoModal()之前添加
dlg.m_ofn.nMaxFile = 2560;//你自己设置足够大的缓冲区大小
char pc[2560];
dlg.m_ofn.lpstrFile = pc;
dlg.m_ofn.lpstrFile[0] = 0;
Featured 2006-12-21
  • 打赏
  • 举报
回复
问题解决了没
wsb_8224 2006-12-21
  • 打赏
  • 举报
回复
选择多个文件,最重要的是加上OFN_ALLOWMULTISELECT标志。当用户选择多个文件,CFileDialog会把选择后的文件名拷贝到一个缓冲区,默认这个缓冲区有200多个字符,这对于很多情况来说太小了。你可以将m_ofn.lpstrFile替换成自己的缓冲区指针:
char
sBuffer[6000];

sBuffer[0] = 0;

CFileDialog dlg(TRUE, NULL, NULL,

OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |

OFN_ALLOWMULTISELECT,

"C source|*.cpp|All files|*.*||");

dlg.m_ofn.lpstrFile = sBuffer;

dlg.m_ofn.nMaxFile = 6000;

如果缓冲区不够大,CommDlgExtendedError()函数的返回值为FNERR_BUFFERTOOSMALL,并且缓冲区的前两个字节包括需要的大小

Elysium 2006-12-21
  • 打赏
  • 举报
回复
好像是多个文件数目的设置
一分之千 2006-12-21
  • 打赏
  • 举报
回复
象楼上样手动设置下应该就可以了吧~
yjgx007 2006-12-21
  • 打赏
  • 举报
回复
TCHAR szFile[200*MAX_PATH];
m_ofn.lpstrFile = szFile;
m_ofn.nMaxFile = 200; // Maximum of 200 files
wsb_8224 2006-12-21
  • 打赏
  • 举报
回复
我也遇到过同样的问题,后来解决了,我去看看,看能不能找到
wenbaby 2006-12-21
  • 打赏
  • 举报
回复
由于允许用户选择多个文件,m_ofn.lpstrFile必须分配足够的空间,所以会出现有的机器没有问题,有的机器会出现问题的情况,这是潜在的问题,需要处理。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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