📄 剖析vc中的文件操作 - pcvc_net.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0050)http://www.pcvc.net/category/content.asp?sendid=14 -->
<HTML><HEAD><TITLE>剖析VC中的文件操作 - PCVC.NET</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>TD {
FONT-SIZE: 12px; LINE-HEIGHT: 150%
}
BODY {
FONT-SIZE: 12px; LINE-HEIGHT: 150%
}
.nav {
COLOR: #333333; TEXT-DECORATION: none
}
.nav:link {
COLOR: #000099; TEXT-DECORATION: none
}
.nav:visited {
COLOR: #000099; TEXT-DECORATION: none
}
.nav:hover {
COLOR: #ff6600; TEXT-DECORATION: underline
}
.d {
FONT-WEIGHT: bold
}
</STYLE>
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY topMargin=0>
<TABLE height=146 cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="3%" height=60><IMG src="剖析VC中的文件操作 - PCVC_NET.files/vc_pi1.gif"
border=0></TD>
<TD width="97%" height=60>
<TABLE height=43 cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%" height=18>
<P align=right><A class=nav href="http://www.pcvc.net/"><IMG
src="剖析VC中的文件操作 - PCVC_NET.files/home.gif" border=0>首页</A> | <IMG
src="剖析VC中的文件操作 - PCVC_NET.files/tg.gif" border=0>投稿</P></TD></TR>
<TR>
<TD width="100%" bgColor=#c0c0c0 height=1></TD></TR>
<TR>
<TD width="100%" height=18></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="100%" colSpan=2 height=74>
<P align=center><EMBED src=images/pcvc.swf width=480
height=74></P></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%">您的位置:<A class=nav
href="http://www.pcvc.net/">PCVC.NET</A> >> <A class=nav
href="http://www.pcvc.net/category/sort.asp?cateid1=2">平台/系统</A> >>
<A class=nav
href="http://www.pcvc.net/category/sort.asp?cateid1=2&cateid2=24">文件操作</A>
>> 正文 </TD></TR>
<TR>
<TD width="100%" bgColor=#c0c0c0 height=1></TD></TR></TBODY></TABLE>
<TABLE height=1 cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%" height=16> </TD></TR>
<TR>
<TD align=middle width="100%" height=1>
<TABLE height=1 cellSpacing=0 cellPadding=0 width="91%" border=0>
<TBODY>
<TR>
<TD style="FONT-SIZE: 20px" width="100%">
<P align=center><FONT face=新宋体><B><FONT
style="FONT-SIZE: 18pt">剖析VC中的文件操作</FONT></B></FONT></P></TD></TR>
<TR>
<TD style="FONT-SIZE: 12px" align=middle width="100%"
height=40>2002-8-4 17:33:29 燕山大学
聂栋栋 阅读次数: 9176</TD></TR>
<TR>
<TD style="FONT-SIZE: 14px"
width="100%">各种关于文件的操作在程序设计中十分常见,如果能对这些操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而可以在较短的时间内编写出高效的代码。本文对Visual C++中有关文件操作进行了全面的介绍,并对在文件操作中经常遇到的一些疑难问题进行了详细分析。 </FONT><BR></FONT><BR>1. 文件的查找 </FONT><BR></FONT><BR>当对一个文件操作时,如果不知道该文件是否存在,就要首先进行查找。MFC中有一个专门用来进行文件查找的类“CFileFind”,使用它可以方便快捷地进行文件的查找。下面这段代码演示了这个类的最基本使用方法。 </FONT><BR></FONT><BR>CString strFileTitle; </FONT><BR></FONT><BR>CFileFind finder; </FONT><BR></FONT><BR>BOOL bWorking = finder.FindFile("C:\\windows\\sysbkup\\*.cab"); </FONT><BR></FONT><BR>while(bWorking) </FONT><BR></FONT><BR>{ </FONT><BR></FONT><BR>bWorking=finder.FindNextFile(); </FONT><BR></FONT><BR>strFileTitle=finder.GetFileTitle(); </FONT><BR></FONT><BR>} </FONT><BR></FONT><BR>2. 文件的打开/保存对话框 </FONT><BR></FONT><BR>让用户选择文件进行打开和存储操作时,就要用到文件打开/保存对话框。MFC的类“CFileDialog”用于实现这种功能。使用“CFileDialog”声明一个对象时,第一个BOOL型参数用于指定文件的打开或保存,当为TRUE时将构造一个文件打开对话框,为FALSE时构造一个文件保存对话框。 </FONT><BR></FONT><BR>在构造“CFileDialog”对象时,如果在参数中指定了“OFN_ALLOWMULTISELECT”风格,则在此对话框中可以进行多选操作。此时要重点注意为此“CFileDialog”对象的“m_ofn.lpstrFile”分配一块内存,用于存储多选操作所返回的所有文件路径名,如果不进行分配或分配的内存过小就会导致操作失败。下面这段程序演示了文件打开对话框的使用方法。 </FONT><BR></FONT><BR>CFileDialog mFileDlg(TRUE, NULL,NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT, "All Files (*.*)|*.*| |", AfxGetMainWnd());</FONT><BR></FONT><BR>CString str(" ", 10000); </FONT><BR></FONT><BR>mFileDlg.m_ofn.lpstrFile=str.GetBuffer(10000); </FONT><BR></FONT><BR>str.ReleaseBuffer(); </FONT><BR></FONT><BR>POSITION mPos=mFileDlg.GetStartPosition(); </FONT><BR></FONT><BR>CString pathName(" ", 128); </FONT><BR></FONT><BR>CFileStatus status; </FONT><BR></FONT><BR>while(mPos!=NULL) </FONT><BR></FONT><BR>{ </FONT><BR></FONT><BR>pathName=mFileDlg.GetNextPathName(mPos); </FONT><BR></FONT><BR>CFile::GetStatus(pathName, status); </FONT><BR></FONT><BR>} </FONT><BR></FONT><BR>3. 文件的读写 </FONT><BR></FONT><BR>文件的读写非常重要,下面将重点进行介绍。文件读写最普通的方法是直接使用“CFile”类进行,如文件的读写可以使用下面的方法: </FONT><BR></FONT><BR>//对文件进行读操作 </FONT><BR></FONT><BR>char sRead[2]; </FONT><BR></FONT><BR>CFile mFile(_T("user.txt"),CFile::modeRead); </FONT><BR></FONT><BR>if(mFile.GetLength()<2) </FONT><BR></FONT><BR>return; </FONT><BR></FONT><BR>mFile.Read(sRead,2); </FONT><BR></FONT><BR>mFile.Close(); </FONT><BR></FONT><BR>//对文件进行写操作 </FONT><BR></FONT><BR>CFile mFile(_T("user.txt"), CFile::modeWrite|CFile::modeCreate); </FONT><BR></FONT><BR>mFile.Write(sRead,2); </FONT><BR></FONT><BR>mFile.Flush(); </FONT><BR></FONT><BR>mFile.Close(); </FONT><BR></FONT><BR>虽然这种方法最为基本,但是它使用烦琐,而且功能非常简单。这里推荐的是使用“CArchive”,它的使用方法简单且功能十分强大。首先还是用“CFile”声明一个对象,然后用这个对象的指针做参数声明一个“CArchive”对象,这样就可以非常方便地存储各种复杂的数据类型了。它的使用方法见下例: </FONT><BR></FONT><BR>//对文件进行写操作 </FONT><BR></FONT><BR>CString strTemp; </FONT><BR></FONT><BR>CFile mFile; </FONT><BR></FONT><BR>mFile.Open("d:\\dd\\try.TRY",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite); </FONT><BR></FONT><BR>CArchive ar(&mFile,CArchive::store); </FONT><BR></FONT><BR>ar<<strTemp; </FONT><BR></FONT><BR>ar.Close(); </FONT><BR></FONT><BR>mFile.Close(); </FONT><BR></FONT><BR>//对文件进行读操作 </FONT><BR></FONT><BR>CFile mFile; </FONT><BR></FONT><BR>if(mFile.Open("d:\\dd\\try.TRY",CFile::modeRead)==0) </FONT><BR></FONT><BR>return; </FONT><BR></FONT><BR>CArchive ar(&mFile,CArchive::load); </FONT><BR></FONT><BR>ar>>strTemp; </FONT><BR></FONT><BR>ar.Close(); </FONT><BR></FONT><BR>mFile.Close(); </FONT><BR></FONT><BR>“CArchive”的“<<”和“>>”操作符用于简单数据类型的读写,对于“CObject”派生类的对象的存取要使用ReadObject()和WriteObject()。使用“CArchive”的ReadClass()和WriteClass()还可以进行类的读写,如: </FONT><BR></FONT><BR>//存储CAboutDlg类 </FONT><BR></FONT><BR>ar.WriteClass(RUNTIME_CLASS(CAboutDlg)); </FONT><BR></FONT><BR>//读取CAboutDlg类 </FONT><BR></FONT><BR>CRuntimeClass*mRunClass=ar.Read </FONT><BR></FONT><BR>Class(); </FONT><BR></FONT><BR>//使用CAboutDlg类 </FONT><BR></FONT><BR>CObject* pObject=mRunClass->CreateObject(); </FONT><BR></FONT><BR>((CDialog* )pObject)->DoModal(); </FONT><BR></FONT><BR>虽然VC提供的文档/视结构中的文档也可进行这些操作,但是不容易理解、使用和管理,如果要进行的文件操作只是简单的读写整行的字符串,建议使用“CStdioFile”,用它来进行此类操作非常方便,如下例: </FONT><BR></FONT><BR>CStdioFile mFile; </FONT><BR></FONT><BR>CFileException mExcept; </FONT><BR></FONT><BR>mFile.Open( "d:\\temp\\aa.bat", CFile::modeWrite, &mExcept); </FONT><BR></FONT><BR>CString string="I am a string."; </FONT><BR></FONT><BR>mFile.WriteString(string); </FONT><BR></FONT><BR>mFile.Close(); </FONT><BR></FONT><BR>4.临时文件的使用 </FONT><BR></FONT><BR>正规软件经常用到临时文件,经常可以看到“C:\Windows\Temp”目录下有大量的扩展名为“.tmp”的文件,这些就是程序运行时建立的临时文件。临时文件的使用方法基本与常规文件一样,只是文件名应该调用函数GetTempFileName()获得。它的第一个参数是建立此临时文件的路径,第二个参数是建立临时文件名的前缀,第四个参数用于得到建立的临时文件名。得到此临时文件名以后,就可以用它来建立并操作文件了,如: </FONT><BR></FONT><BR>char szTempPath[_MAX_PATH],szTempfile[_MAX_PATH]; </FONT><BR></FONT><BR>GetTempPath(_MAX_PATH, szTempPath); </FONT><BR></FONT><BR>GetTempFileName(szTempPath,_T ("my_"),0,szTempfile); </FONT><BR></FONT><BR>CFile m_tempFile(szTempfile,CFile:: modeCreate|CFile:: modeWrite); </FONT><BR></FONT><BR>char m_char='a'; </FONT><BR></FONT><BR>m_tempFile.Write(&m_char,2); </FONT><BR></FONT><BR>m_tempFile.Close(); </FONT><BR></FONT><BR>5.文件的复制、删除等 </FONT><BR></FONT><BR>MFC中没有提供直接进行这些操作的功能,因而要使用SDK。SDK中的文件相关函数常用的有CopyFile()、CreateDirectory()、DeleteFile()、MoveFile()。它们的用法很简单,可参考MSDN。<BR><BR></TD></TR>
<TR>
<TD align=middle width="100%" bgColor=#c0c0c0 height=1></TD></TR>
<TR>
<TD style="FONT-SIZE: 14px" align=left width="100%" height=2><BR>
<TABLE cellSpacing=0 cellPadding=0 width=730 border=0>
<TBODY>
<TR bgColor=#ccccc0>
<TD class=a width=570
height=20><B>网友对该文章的评论</B></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=730 border=0>
<TBODY>
<TR>
<TD style="FONT-SIZE: 14px"><IMG
src="剖析VC中的文件操作 - PCVC_NET.files/doc.gif"> <SPAN class=d>网友:
fanoble(fanoble@yeah.net) 发表于: 2003-9-28
17:36:19</SPAN><BR><BR>那个CFileDialog怎么不好用</FONT><BR>按上面的方法打开多个文件时</FONT><BR>最多就21个</FONT><BR>再多了就一个也没有了
</TD></TR>
<TR bgColor=#ccccc0>
<TD height=1></TD></TD>
<TR>
<TD style="FONT-SIZE: 14px"><IMG
src="剖析VC中的文件操作 - PCVC_NET.files/doc.gif"> <SPAN class=d>网友:
dd(dd) 发表于: 2003-7-10 15:44:56</SPAN><BR><BR>dddddd
</TD></TR>
<TR bgColor=#ccccc0>
<TD height=1></TD></TD>
<TR>
<TD style="FONT-SIZE: 14px"><IMG
src="剖析VC中的文件操作 - PCVC_NET.files/doc.gif"> <SPAN class=d>网友:
qq(qxy163fqxy@163.com) 发表于: 2003-5-31
14:53:03</SPAN><BR><BR>你的文章很好,对我很有帮助! </TD></TR>
<TR bgColor=#ccccc0>
<TD height=1></TD></TD>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -