用CFile open 创建文件失败

lc47517680 2011-05-11 02:51:46
工程属性为UNICODE,
fLocal.Open(sUpdateFileName,CFile::modeCreate|CFile::modeWrite)

sUpdateFileName为CString类型

英文路径文件创建成功,中文路径不成功。

大家帮帮忙了!!!
...全文
712 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
l918c 2011-05-13
  • 打赏
  • 举报
回复
问题出现在sUpdateFileName,检查赋值时是否是正确的路径。
lc47517680 2011-05-11
  • 打赏
  • 举报
回复
CFileException e;
if (!fLocal.Open(sUpdateFileName,CFile::modeCreate|CFile::modeWrite,&e))

e的错误提示:
m_lOsError 123
m_cause 3
困扰一天了 也没解决 来个高人吧
lc47517680 2011-05-11
  • 打赏
  • 举报
回复
我的路径是通过::GetModuleFileName(NULL, m_szMainDir, sizeof(m_szMainDir));
这个方法获得的,不是写死的。
jdzfjfhnui 2011-05-11
  • 打赏
  • 举报
回复
e:\工作\更新模块\bin\debug

确定这个目录存在
zgl7903 2011-05-11
  • 打赏
  • 举报
回复
先创建路径,再建文件


DWORD CreateALLDirectory(LPCTSTR Directory) //创建文件夹
{
DWORD ret = ERROR_SUCCESS;
CString Target_Directory;
Target_Directory = Directory;

if(Target_Directory.Right(1) != _T('\\'))
Target_Directory += _T("\\");

int i = Target_Directory.Find( _T(":\\"),0);
if(i != -1)
i++;

while(ret == ERROR_SUCCESS && i < Target_Directory.GetLength() )
{
CString Direct_char;
Direct_char = Target_Directory;

i = Direct_char.Find( _T('\\'),i+1);
if(i==-1)
break;
Direct_char.GetBufferSetLength(i);

CString Find_char;
Find_char.Format( _T("%s\\*.*"),Direct_char);

CFileFind finder;
if(!finder.FindFile(Find_char))//未找到目录
{
if(!CreateDirectory(Direct_char,NULL))//建立目录
{
ret = GetLastError();
}
}
finder.Close();
}

return(ret);
}




CreateALLDirectory( _T("e:\\工作\\更新模块\\bin\\debug\\") );
CFile fileOp( _T("e:\\工作\\更新模块\\bin\\debug\\1.0.1.zip"), ……);
Gloveing 2011-05-11
  • 打赏
  • 举报
回复
把"e:\工作\更新模块\bin\debug\1.0.1.zip"
改成: _T("e:\\工作\\更新模块\\bin\\debug\\1.0.1.zip")呢?
lc47517680 2011-05-11
  • 打赏
  • 举报
回复
1.sUpdateFileName 不是乱码;filename = 0x00fdeb60 "e:\工作\更新模块\bin\debug\1.0.1.zip
"
2.GetLastError() 错误代码 为123 :
文件名、目录名或卷标语法不正确。
一桶姜山 2011-05-11
  • 打赏
  • 举报
回复
1、设断点看看sUpdateFileName是乱码还是正常的
2、GetLastError()看错误代码
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
void CBandfileDlg::OnBandFile() { // TODO: Add your control notification handler code here CString filename; int filenum = 0; int headoffset; int fileoffset; int filelen; int filenamelen; FILE *fp; CFile file; char *buff; char fileflag[5] = "LICH"; HTREEITEM hti1; CString strTitle; filenum = m_filelist.GetCount(); if(filenum == 0) { AfxMessageBox("请选择需要打包的文件"); return ; } buff = (char *)malloc(0x800000); if(buff == NULL) { AfxMessageBox("内存申请失败"); return; } filename = this->m_path + "upgrade.bin"; fp = fopen(filename,"wb"); if(fp == NULL) { AfxMessageBox("文件创建失败!"); return; } /*初始化文件头指针跟文件偏移指针*/ headoffset = (int)buff; fileoffset = headoffset + 1024; /*写文件标志*/ memcpy((void *)headoffset,fileflag,4); headoffset+=4; hti1 = m_filelist.GetFirstVisibleItem(); /*把文件个数写入文件头中*/ memcpy((void *)headoffset,&filenum;,sizeof(int)); headoffset+=sizeof(int); for(int i=0;i<filenum;i++) { strTitle = m_filelist.GetItemText(hti1); /*打开文件 获取文件长度,把文件读到内存的fileoffset位置,把文件名跟长度写入headoffset处*/ if(!file.Open(this->m_path + strTitle,CFile::modeRead | CFile::typeBinary)) { AfxMessageBox(strTitle + "打开失败"); return; } /*获取文件名长度跟文件大小*/ filelen = file.GetLength(); filenamelen = strTitle.GetLength(); /*把文件名跟文件大小写入文件头中*/ memcpy((void *)headoffset,&filelen;,sizeof(int)); headoffset+=sizeof(int); memcpy((void *)headoffset,&filenamelen;,sizeof(int)); headoffset+=sizeof(int); sprintf((char *)headoffset,"%s",strTitle); headoffset+=filenamelen; /*把文件写入内存中*/ file.Read((void *)fileoffset,filelen); fileoffset += filelen; file.Close(); hti1 = m_filelist.GetNextItem(hti1,1); } fwrite(buff,1,fileoffset-(int)buff,fp); free(buff); AfxMessageBox("OK"); fclose(fp); } int CBandfileDlg::separatefile(CString path,CString filename) { int filenamelen; int filelen; int filenum; int c; int k; char flag[5]; int headoffset = 0; int fileoffset = 1024; char tempfilename[100]; char writefilename[200]; int i; FILE * rfp; FILE * wfp; rfp = fopen(filename,"rb"); if(rfp == NULL) { return 1; } fread(flag,4,1,rfp); flag[4] = '\0'; if(strcmp(flag,"LICH") !=0) { fclose(rfp); AfxMessageBox("文件不能识别"); return 2; } headoffset +=4; fread(&filenum;,sizeof(int),1,rfp); headoffset += sizeof(int); for(i=0;i<filenum;i++) { /*读文件头*/ fseek(rfp,headoffset,0); fread(&filelen;,sizeof(int),1,rfp); fread(&filenamelen;,sizeof(int),1,rfp); fread(tempfilename,filenamelen,1,rfp); tempfilename[filenamelen] = '\0'; headoffset += 2*sizeof(int)+filenamelen; /*打开文件*/ sprintf(writefilename,"%s%s",path,tempfilename); wfp = fopen(writefilename,"wb"); if(wfp == NULL) { return 3; } m_filelist.InsertItem(tempfilename,0,0,NULL); /*读文件体*/ fseek(rfp,fileoffset,0); for(k=0;k<filelen;k++) { c = fgetc(rfp); fputc(c,wfp); } fileoffset += filelen; fclose(wfp); } fclose(wfp); AfxMessageBox("OK"); return 0; }

16,471

社区成员

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

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

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