VC_文件操作
1
.
?
文件的查找
?
當(dāng)對(duì)一個(gè)文件操作時(shí),如果不知道該文件是否存在,就要首先進(jìn)行查找。
MFC
中有一個(gè)專門用來進(jìn)行文件查找的類
“CFileFind”
,使用它可以方便快捷地進(jìn)行文件的查找。下面這段代碼演示了這個(gè)類的最基本使用方法。
?
CString?strFileTitle;?
CFileFind?finder;?
BOOL?bWorking?=?finder.FindFile("C:\\windows\\sysbkup\\*.cab");?
while(bWorking)?
{?
bWorking=finder.FindNextFile();?
strFileTitle=finder.GetFileTitle();?
}?
2
.
?
文件的打開
/
保存對(duì)話框
?
讓用戶選擇文件進(jìn)行打開和存儲(chǔ)操作時(shí),就要用到文件打開
/
保存對(duì)話框。
MFC
的類
“CFileDialog”
用于實(shí)現(xiàn)這種功能。使用
“CFileDialog”
聲明一個(gè)對(duì)象時(shí),第一個(gè)
BOOL
型參數(shù)用于指定文件的打開或保存,當(dāng)為
TRUE
時(shí)將構(gòu)造一個(gè)文件打開對(duì)話框,為
FALSE
時(shí)構(gòu)造一個(gè)文件保存對(duì)話框。
?
在構(gòu)造
“CFileDialog”
對(duì)象時(shí),如果在參數(shù)中指定了
“OFN_ALLOWMULTISELECT”
風(fēng)格,則在此對(duì)話框中可以進(jìn)行多選操作。此時(shí)要重點(diǎn)注意為此
“CFileDialog”
對(duì)象的
“m_ofn.lpstrFile”
分配一塊內(nèi)存,用于存儲(chǔ)多選操作所返回的所有文件路徑名,如果不進(jìn)行分配或分配的內(nèi)存過小就會(huì)導(dǎo)致操作失敗。下面這段程序演示了文件打開對(duì)話框的使用方法。
?
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.ReleaseBuffer();?
POSITION?mPos=mFileDlg.GetStartPosition();?
CString?pathName("?",?128);?
CFileStatus?status;?
while(mPos!=NULL)?
{?
pathName=mFileDlg.GetNextPathName(mPos);?
CFile::GetStatus(pathName,?status);?
}?
3
.
?
文件的讀寫
?
文件的讀寫非常重要,下面將重點(diǎn)進(jìn)行介紹。文件讀寫最普通的方法是直接使用
“CFile”
類進(jìn)行,如文件的讀寫可以使用下面的方法:
?
//
對(duì)文件進(jìn)行讀操作
?
char?sRead[2];?
CFile?mFile(_T("user.txt"),CFile::modeRead);?
if(mFile.GetLength()<2)?
return;?
mFile.Read(sRead
,
2);?
mFile.Close();?
//
對(duì)文件進(jìn)行寫操作
?
CFile?mFile(_T("user.txt"),?CFile::modeWrite|CFile::modeCreate);?
mFile.Write(sRead
,
2);?
mFile.Flush();?
mFile.Close();?
雖然這種方法最為基本,但是它使用煩瑣,而且功能非常簡(jiǎn)單。這里推薦的是使用
“CArchive”
,它的使用方法簡(jiǎn)單且功能十分強(qiáng)大。首先還是用
“CFile”
聲明一個(gè)對(duì)象,然后用這個(gè)對(duì)象的指針做參數(shù)聲明一個(gè)
“CArchive”
對(duì)象,這樣就可以非常方便地存儲(chǔ)各種復(fù)雜的數(shù)據(jù)類型了。它的使用方法見下例:
?
//
對(duì)文件進(jìn)行寫操作
?
CString?strTemp;?
CFile?mFile;?
mFile.Open("d:\\dd\\try.TRY",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);?
CArchive?ar(&mFile
,
CArchive::store);?
ar<<strTemp;?
ar.Close();?
mFile.Close();?
//
對(duì)文件進(jìn)行讀操作
?
CFile?mFile;?
if(mFile.Open("d:\\dd\\try.TRY"
,
CFile::modeRead)==0)?
return;?
CArchive?ar(&mFile
,
CArchive::load);?
ar>>strTemp;?
ar.Close();?
mFile.Close();?
“CArchive”
的
“<<”
和
“>>”
操作符用于簡(jiǎn)單數(shù)據(jù)類型的讀寫,對(duì)于
“CObject”
派生類的對(duì)象的存取要使用
ReadObject()
和
WriteObject()
。使用
“CArchive”
的
ReadClass()
和
WriteClass()
還可以進(jìn)行類的讀寫,如:
?
//
存儲(chǔ)
CAboutDlg
類
?
ar.WriteClass(RUNTIME_CLASS(CAboutDlg));?
//
讀取
CAboutDlg
類
?
CRuntimeClass*mRunClass=ar.Read?
Class();?
//
使用
CAboutDlg
類
?
CObject*?pObject=mRunClass->CreateObject();?
((CDialog*?)pObject)->DoModal();?
雖然
VC
提供的文檔
/
視結(jié)構(gòu)中的文檔也可進(jìn)行這些操作,但是不容易理解、使用和管理,如果要進(jìn)行的文件操作只是簡(jiǎn)單的讀寫整行的字符串,建議使用
“CStdioFile”
,用它來進(jìn)行此類操作非常方便,如下例:
?
CStdioFile?mFile;?
CFileException?mExcept;?
mFile.Open(?"d:\\temp\\aa.bat",?CFile::modeWrite,?&mExcept);?
CString?string="I?am?a?string.";?
mFile.WriteString(string);?
mFile.Close();?
4
.臨時(shí)文件的使用
?
正規(guī)軟件經(jīng)常用到臨時(shí)文件,經(jīng)常可以看到
“C:\Windows\Temp”
目錄下有大量的擴(kuò)展名為
“.tmp”
的文件,這些就是程序運(yùn)行時(shí)建立的臨時(shí)文件。臨時(shí)文件的使用方法基本與常規(guī)文件一樣,只是文件名應(yīng)該調(diào)用函數(shù)
GetTempFileName()
獲得。它的第一個(gè)參數(shù)是建立此臨時(shí)文件的路徑,第二個(gè)參數(shù)是建立臨時(shí)文件名的前綴,第四個(gè)參數(shù)用于得到建立的臨時(shí)文件名。得到此臨時(shí)文件名以后,就可以用它來建立并操作文件了,如:
?
char?szTempPath[_MAX_PATH]
,
szTempfile[_MAX_PATH];?
GetTempPath(_MAX_PATH,?szTempPath);?
GetTempFileName(szTempPath
,
_T?("my_")
,
0
,
szTempfile);?
CFile?m_tempFile(szTempfile
,
CFile::?modeCreate|CFile::?modeWrite);?
char?m_char='a';?
m_tempFile.Write(&m_char
,
2);?
m_tempFile.Close();?
5
.文件的復(fù)制、刪除等
?
MFC
中沒有提供直接進(jìn)行這些操作的功能,因而要使用
SDK
。
SDK
中的文件相關(guān)函數(shù)常用的有
CopyFile()
、
CreateDirectory()
、
DeleteFile()
、
MoveFile()
。它們的用法很簡(jiǎn)單,可參考
MSDN
。
posted on 2008-09-04 17:25 死神 閱讀(447) 評(píng)論(0) 編輯 收藏 所屬分類: C/C++