请问用CFile怎样删除文件的一段内容? 比如一个文件有120KB我要把最后的20KB内容删掉,保留前100KB的内容。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我一般将CFile的内容读到CString中,然后读取左边的100KB再写回到文件中去。 你们的办法都不对,看我的:CFile file;file.Open("test.dat", CFile::modeReadWrite);DWORD dwLength = file.GetLength();dwLength -= 20 * 1024;file.SetLength(dwLength);file.Close(); 楼上的方法是行得通,但 vcforever(霓裳羽衣)得方法也是可以实现的啊,不要说人家不对嘛;)还是把异常加上吧,呵呵。。try{ CFile file("test.txt", CFile::modeReadWrite); DWORD dwLength = file.GetLength(); dwLength -= 20 * 1024; file.SetLength(dwLength); file.Close();}catch(CFileException* e){ e->ReportError(); e->Delete();} try{ CFileException e CFile file("test.txt", CFile::modeReadWrite,&e); DWORD dwLength = file.GetLength(); dwLength -= 20 * 1024; file.SetLength(dwLength); file.Close();}catch(CFileException* e){ e->ReportError(); e->Delete();} to dreamchild(梦小孩) : 会的啊,我试过了~~~~~ 使用文件指针来实现。 假设文件中[78K,79K]这部分内容要删除,则可用[79K,文件尾]的数据直接覆盖[78K,文件尾]那部分数据,从面实现了[78K,79K]这部分内容的删除工作。 操作函数如下:bool DeleteFileMidContent(CString szFullFilePath, DWORD dwDeleteBeginPos, DWORD dwDeleteBytesCount){ CFile src, dest; if(src.Open(szFullFilePath, CFile::modeReadWrite|CFile::shareDenyNone) && dest.Open(szFullFilePath, CFile::modeReadWrite|CFile::shareDenyNone)) { dest.Seek(dwDeleteBeginPos, CFile::begin); src.Seek(dwDeleteBeginPos + dwDeleteBytesCount, CFile::begin);//略过要删除的部分 const WORD wBufSize = 1024; BYTE buf[wBufSize]; DWORD readBytesCount = src.Read(buf, wBufSize); while(readBytesCount) { dest.Write(buf, readBytesCount); src.Read(buf,wBufSize); } src.Close(); dest.Close(); return true; } return false;} 用老函数实现: FILE *f;if((f=fopen("文件名","rb+"))==NULL) {exit(0);} int Handle=fileno(f); chsize(Handle,100000-20000); // 改变文件长度 100k 变成 80k fclose(f); 在visual studio 2005 中 怎么样编译运行c++文件 帮帮忙,哪位兄弟有ListCtrl自画控件的XP风格的类啊? 使用GDI+ 在 BITMAP上画的图怎么不按顺序出现? CAsyncSocket的Create问题 请指教,怎样用多线程来实现 能否在对话框的构造函数或InitDialog函数中销毁掉对话框? 哪位懂得测试工具CodeReview在哪下载?(来着有分) 关于CreateIc函数,回答好而全者给满分。 CDialog类没有办法添加自定义消息吗? 怎么从内存创建HCURSOR VC中怎样产生一个正态分布的随机数? 用MFC如何实现类似与VC那样的界面
CFile file;
file.Open("test.dat", CFile::modeReadWrite);
DWORD dwLength = file.GetLength();
dwLength -= 20 * 1024;
file.SetLength(dwLength);
file.Close();
还是把异常加上吧,呵呵。。
try{
CFile file("test.txt", CFile::modeReadWrite);
DWORD dwLength = file.GetLength();
dwLength -= 20 * 1024;
file.SetLength(dwLength);
file.Close();
}
catch(CFileException* e){
e->ReportError();
e->Delete();
}
CFileException e
CFile file("test.txt", CFile::modeReadWrite,&e);
DWORD dwLength = file.GetLength();
dwLength -= 20 * 1024;
file.SetLength(dwLength);
file.Close();
}
catch(CFileException* e){
e->ReportError();
e->Delete();
}
会的啊,我试过了~~~~~
假设文件中[78K,79K]这部分内容要删除,则可用[79K,文件尾]的数据直接覆盖[78K,文件尾]那部分数据,从面实现了[78K,79K]这部分内容的删除工作。
操作函数如下:
bool DeleteFileMidContent(CString szFullFilePath,
DWORD dwDeleteBeginPos,
DWORD dwDeleteBytesCount)
{
CFile src, dest;
if(src.Open(szFullFilePath, CFile::modeReadWrite|CFile::shareDenyNone)
&& dest.Open(szFullFilePath, CFile::modeReadWrite|CFile::shareDenyNone))
{
dest.Seek(dwDeleteBeginPos, CFile::begin);
src.Seek(dwDeleteBeginPos + dwDeleteBytesCount, CFile::begin);//略过要删除的部分
const WORD wBufSize = 1024;
BYTE buf[wBufSize];
DWORD readBytesCount = src.Read(buf, wBufSize);
while(readBytesCount)
{
dest.Write(buf, readBytesCount);
src.Read(buf,wBufSize);
} src.Close();
dest.Close();
return true;
}
return false;
}
FILE *f;if((f=fopen("文件名","rb+"))==NULL) {exit(0);} int Handle=fileno(f);
chsize(Handle,100000-20000); // 改变文件长度 100k 变成 80k fclose(f);