VC_文件操作
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.ReleaseBuffer();?
POSITION?mPos=mFileDlg.GetStartPosition();?
CString?pathName("?",?128);?
CFileStatus?status;?
while(mPos!=NULL)?
{?
pathName=mFileDlg.GetNextPathName(mPos);?
CFile::GetStatus(pathName,?status);?
}?
3
.
?
文件的讀寫
?
文件的讀寫非常重要,下面將重點進行介紹。文件讀寫最普通的方法是直接使用
“CFile”
類進行,如文件的讀寫可以使用下面的方法:
?
//
對文件進行讀操作
?
char?sRead[2];?
CFile?mFile(_T("user.txt"),CFile::modeRead);?
if(mFile.GetLength()<2)?
return;?
mFile.Read(sRead
,
2);?
mFile.Close();?
//
對文件進行寫操作
?
CFile?mFile(_T("user.txt"),?CFile::modeWrite|CFile::modeCreate);?
mFile.Write(sRead
,
2);?
mFile.Flush();?
mFile.Close();?
雖然這種方法最為基本,但是它使用煩瑣,而且功能非常簡單。這里推薦的是使用
“CArchive”
,它的使用方法簡單且功能十分強大。首先還是用
“CFile”
聲明一個對象,然后用這個對象的指針做參數聲明一個
“CArchive”
對象,這樣就可以非常方便地存儲各種復雜的數據類型了。它的使用方法見下例:
?
//
對文件進行寫操作
?
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();?
//
對文件進行讀操作
?
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”
的
“<<”
和
“>>”
操作符用于簡單數據類型的讀寫,對于
“CObject”
派生類的對象的存取要使用
ReadObject()
和
WriteObject()
。使用
“CArchive”
的
ReadClass()
和
WriteClass()
還可以進行類的讀寫,如:
?
//
存儲
CAboutDlg
類
?
ar.WriteClass(RUNTIME_CLASS(CAboutDlg));?
//
讀取
CAboutDlg
類
?
CRuntimeClass*mRunClass=ar.Read?
Class();?
//
使用
CAboutDlg
類
?
CObject*?pObject=mRunClass->CreateObject();?
((CDialog*?)pObject)->DoModal();?
雖然
VC
提供的文檔
/
視結構中的文檔也可進行這些操作,但是不容易理解、使用和管理,如果要進行的文件操作只是簡單的讀寫整行的字符串,建議使用
“CStdioFile”
,用它來進行此類操作非常方便,如下例:
?
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
.臨時文件的使用
?
正規軟件經常用到臨時文件,經常可以看到
“C:\Windows\Temp”
目錄下有大量的擴展名為
“.tmp”
的文件,這些就是程序運行時建立的臨時文件。臨時文件的使用方法基本與常規文件一樣,只是文件名應該調用函數
GetTempFileName()
獲得。它的第一個參數是建立此臨時文件的路徑,第二個參數是建立臨時文件名的前綴,第四個參數用于得到建立的臨時文件名。得到此臨時文件名以后,就可以用它來建立并操作文件了,如:
?
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
.文件的復制、刪除等
?
MFC
中沒有提供直接進行這些操作的功能,因而要使用
SDK
。
SDK
中的文件相關函數常用的有
CopyFile()
、
CreateDirectory()
、
DeleteFile()
、
MoveFile()
。它們的用法很簡單,可參考
MSDN
。
posted on 2008-09-04 17:25 死神 閱讀(447) 評論(0) 編輯 收藏 所屬分類: C/C++