CFile使用方法

CFile是MFC文件類的基類,它直接提供非緩衝的二進制磁盤輸入/輸出設備,並直接地通過派生類支持文本文件和內存文件。CFile與CArchive類共同使用,支持MFC對象的串行化。該類與其派生類的層次關係讓程序通過多形CFile接口操作所有文件對象。例如,一個內存文件相當一個磁盤文件。使用CFile及其派生類進行一般目的的磁盤I/O,使用ofstream或其它Microsoft輸入輸出流類將格式化文本送到磁盤文件。通常,一個磁盤文件在CFile構造時自動打開並在析構時關閉。靜態成員函數使你可以在不打開文件的情況下檢查文件狀態。

#include <afx.h>

 

數據成員:

  m_hFile 常包含操作系統文件句柄

 

構造函數:

  CFile 從一個路徑或文件句柄構造一個CFile對象Abort 不管任何警告和錯誤,關閉一個文件Duplicate 構造一個基於該文件的副本Open 帶錯誤檢驗選項,安全打開一個文件Close 關閉文件,刪除對象

 

輸入輸出:

  Read 從文件的當前位置讀數據ReadHuge 可從文件的當前位置讀取大於64K數據,在32位編程中廢棄了,見ReadWrite 將文件數據寫入當前文件位置WriteHuge 可將文件的大於64K數據寫到當前文件位置,在32位編程中廢棄了,見WriteFlush 溢去未被寫入的任何數據

 

定位:

  Seek 定位於當前文件指針SeekToBegin 定位當前文件指針到文件開頭SeekToEnd 定位當前文件指針到文件尾GetLength 獲取文件長度SetLength 改變文件長度

 

封鎖:

  LockRange 在文件中封鎖一定範圍內的字節UnlockRange 解鎖一定範圍內的字節

 

狀態:

  GetPosition 獲取當前文件指針GetStatus 獲取打開文件的狀態GetFileName 獲取被選文件的文件名GetFileTitle 獲取被選文件的標題GetFilePath 獲取被選文件的完整路徑SetFilePath 設置被選文件的完整路徑

 

靜態:

  Rename 改名指定文件(靜態函數)Remove 刪除指定文件(靜態函數)GetStatus 獲取指定文件的狀態(靜態,虛函數)SetStatus 設置指定文件的狀態(靜態,虛函數)

 

 

CFile操作詳解

各種關於文件的操作在程序設計中是十分常見,如果能對其各種操作都瞭如指掌,就可以根據實際情況找到最佳的解決方案,從而在較短的時間內編寫出高效的代碼,因而熟練的掌握文件操作是十分重要的。本文將對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.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();

  //對文件進行寫操作

  TCHAR sWrite[]="這裏寫一竄包含中文的字符.abcd123";

  BYTE sUNICODE={0xff,0xfe};

  CFile mFile(_T("user.txt "), CFile::modeWrite|CFile::modeCreate);

  mFile.Write(sUNICODE,sizeof(sUNICODE)); //將文件變爲UNICODE編碼

  mFile.Write(sWrite,sizeof(sWrite));

  mFile.Flush();

  mFile.Close();

  注意:如果sWiite中沒有中文等雙字節字符,則就沒有這樣麻煩.

  雖然這種方法最爲基本,但是它的使用繁瑣,而且功能非常簡單。我向你推薦的是使用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.ReadClass();

  //使用CAboutDlg類

  CObject* pObject=mRunClass->CreateObject();

  ((CDialog* )pObject)->DoModal();

  雖然VC提供的文檔/視結構中的文檔也可進行這些操作,但是不容易理解、使用和管理,因此雖然很多VC入門的書上花費大量篇幅講述文檔/視結構,但我建議你最好不要使用它的文檔。關於如何進行文檔/視的分離有很多書介紹,包括非常著名的《Visual C++ 技術內幕》。

  如果你要進行的文件操作只是簡單的讀寫整行的字符串,我建議你使用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。

  1,判斷文件是否存在

  access(filename,mode);

  2,對於不同用途又不同的文件操作,其中API函數CreateFile()也是比較有用處理方式,對於巨型文件很合適的其他的樓上的大都說了,不重複了.

  [1]顯示對話框,取得文件名

  CString FilePathName;

  CFileDialog dlg(TRUE);///TRUE爲OPEN對話框,FALSE爲S***E AS對話框

  if (dlg.DoModal() == IDOK)

  FilePathName=dlg.GetPathName();

  相關信息:CFileDialog 用於取文件名的幾個成員函數:

  假如選擇的文件是C:/WINDOWS/TEST.EXE

  則(1)GetPathName();取文件名全稱,包括完整路徑。取回C:/WINDOWS/TEST.EXE

  (2)GetFileTitle();取回TEST

  (3)GetFileName();取回TEST.EXE

  (4)GetFileExt();取擴展名EXE

  [2]打開文件

  CFile file("C:/HELLO.TXT",CFile::modeRead);//只讀方式打開

  CFile::modeCreate 直接構造去創建一個新的文件如果這個文件存在,則刪除這個文件你所有內容

  CFile::modeNoTruncate 聯合創建屬性,如果這個文件已創建,則不刪除原文件內容,因而這個文件是保證打開,其他被重新創建或退出文件,例如,當一個打開設置文件可能或不可能已退出,這個屬性對於CStdioFile是非常好的

  CFile::modeRead 打開爲只讀屬性.

  CFile::modeWrite 打開爲只寫屬性.

  CFile::modeReadWrite 打開爲讀寫屬性.

  CFile::modeNoInherit 防止這個文件來源於子進程.

  CFile::shareDenyNone 在這個文件讀寫處理之外打開這個文件

  CFile::shareDenyRead 以獨佔方式打開,拒絕其他讀操作

  CFile::shareDenyWrite 以獨佔方式打開,拒絕其他寫操作

  CFile::shareExclusive 以獨佔方式打開文件,拒絕其他讀寫操作訪問這個文件Opens the file with exclusive mode, denying other 如果這個文件已打開進行讀寫操作則構造失敗

  CFile::shareCompat 這個屬性在 32 bit MFC是不可用的. This flag maps to CFile::shareExclusive 當應用在CFile::Open.

  CFile::typeText 設置文本模式特別處理回車換行 (used in derived classes only).

  CFile::typeBinary 設置二進制模式(used in derived classes only).

  例子:

  {

  CFile file;

  file.Open("C:/HELLO.TXT",CFile::modeCreate|Cfile::modeWrite);

  .

  .

  .

  }

  [3]移動文件指針

  file.Seek(100,CFile::begin);///從文件頭開始往下移動100字節

  file.Seek(-50,CFile::end);///從文件末尾往上移動50字節

  file.Seek(-30,CFile::current);///從當前位置往上移動30字節

  file.SeekToBegin();///移到文件頭

  file.SeekToEnd();///移到文件尾

  [4]讀寫文件

  讀文件:

  char buffer[1000];

  file.Read(buffer,1000);

  寫文件:

  CString string("自強不息");

  file.Write(string,8);

  [5]關閉文件

  file.Close();

發佈了2 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章