VC++中檔案操作(一)---CFileFind,CFileDialog,CFile,CArchive,CStdioFile

來源:互聯網
上載者:User

標籤:move   app   adc   關閉   完整路徑   寫入   dal   簡單的   run   

各種關於檔案的操作在程式設計中是十分常見,如果能對其各種操作都了如指掌,就可以根據實際情況找到最佳的解決方案,從而在較短的時間內編寫出高效的代碼,因而熟練的掌握檔案操作是十分重要的。本文將對Visual C++中有關檔案操作進行全面的介紹,並對在檔案操作中經常遇到的一些疑難問題進行詳細的分析。

VC++中檔案操作(一)

***************************************************************************
××××××××××第一、VC有關檔案操作,參考資料1
***************************************************************************

  1.檔案的尋找---CFileFind
  當對一個檔案操作時,如果不知道該檔案是否存在,就要首先進行尋找。MFC中有一個專門用來進行檔案尋找的類CFileFind,使用它可以方便快捷地進行檔案的尋找。下面這段代碼示範了這個類的最基本使用方法。 

1   CString strFileTitle; 2   CFileFind finder; 3   BOOL bWorking = finder.FindFile("C:\\windows\\sysbkup\\*.cab"); 4   while(bWorking) 5   { 6   bWorking=finder.FindNextFile(); 7   strFileTitle=finder.GetFileTitle(); 8   }

 

  2.對話方塊檔案的開啟/儲存--- CFileDialog
  讓使用者選擇檔案進行開啟和儲存操作時,就要用到檔案開啟/儲存對話方塊。MFC的類CFileDialog用於實現這種功能。使用CFileDialog聲明一個對象時,第一個BOOL型參數用於指定檔案的開啟或儲存,當為TRUE時將構造一個檔案開啟對話方塊,為FALSE時構造一個檔案儲存對話方塊。 
  在構造CFileDialog對象時,如果在參數中指定了OFN_ALLOWMULTISELECT風格,則在此對話方塊中可以進行多選操作。此時要重點注意為此CFileDialog對象的m_ofn.lpstrFile分配一塊記憶體,用於儲存多選操作所返回的所有檔案路徑名,如果不進行分配或分配的記憶體過小就會導致操作失敗。下面這段程式示範了檔案開啟對話方塊的使用方法。 

 1   CFileDialog mFileDlg(TRUE,NULL,NULL,  2   OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,  3   "All Files (*.*)|*.*||",AfxGetMainWnd());  4   CString str(" ",10000);  5   mFileDlg.m_ofn.lpstrFile=str.GetBuffer(10000);  6   str.ReleaseBuffer();  7   POSITION mPos=mFileDlg.GetStartPosition();  8   CString pathName(" ",128);  9   CFileStatus status; 10   while(mPos!=NULL) 11   { 12   pathName=mFileDlg.GetNextPathName(mPos); 13   CFile::GetStatus( pathName, status ); 14   }

 

  3.檔案的讀寫---CFile,CArchive,CStdioFile
  檔案的讀寫非常重要,下面將重點進行介紹。檔案讀寫的最普通的方法是直接使用CFile進行,如檔案的讀寫可以使用下面的方法: 

 1 //對檔案進行讀操作  2   char sRead[2];  3   CFile mFile(_T("user.txt"),CFile::modeRead);  4   if(mFile.GetLength()<2)  5   return;  6   mFile.Read(sRead,2);  7   mFile.Close(); 
8   //對檔案進行寫操作 9   CFile mFile(_T("user.txt "), CFile::modeWrite|CFile::modeCreate); 10   mFile.Write(sRead,2); 11   mFile.Flush(); 12   mFile.Close();

  雖然這種方法最為基本,但是它的使用繁瑣,而且功能非常簡單。我向你推薦的是使用CArchive,它的使用方法簡單且功能十分強大。首先還是用CFile聲明一個對象,然後用這個對象的指標做參數聲明一個CArchive對象,你就可以非常方便地儲存各種複雜的資料類型了。它的使用方法見下例。 

 1   //對檔案進行寫操作  2   CString strTemp;  3   CFile mFile;  4   mFile.Open("d:\\dd\\try.TRY",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);  5   CArchive ar(&mFile,CArchive::store);  6   ar<<  ar.Close();  7   mFile.Close(); 
8   //對檔案進行讀操作 9   CFile mFile; 10   if(mFile.Open("d:\\dd\\try.TRY",CFile::modeRead)==0) 11   return; 12   CArchive ar(&mFile,CArchive::load); 13    ar>>strTemp; 14   ar.Close(); 15   mFile.Close();

  

     CArchive的 << 和>> 操作符用於單一資料型別的讀寫,對於CObject衍生類別的對象的存取要使用ReadObject()和WriteObject()。使用CArchive的ReadClass()和WriteClass()還可以進行類的讀寫,如: 

1  //儲存CAboutDlg類 2   ar.WriteClass(RUNTIME_CLASS(CAboutDlg)); 3   //讀取CAboutDlg類 4   CRuntimeClass* mRunClass=ar.ReadClass(); 5   //使用CAboutDlg類 6   CObject* pObject=mRunClass->CreateObject(); 7   ((CDialog* )pObject)->DoModal(); 

  

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

如果你要進行的檔案操作只是簡單的讀寫整行的字串,我建議你使用CStdioFile,用它來進行此類操作非常方便,如下例。 

1   CStdioFile mFile; 2   CFileException mExcept; 3   mFile.Open( "d:\\temp\\aa.bat", CFile::modeWrite, &mExcept); 4   CString string="I am a string."; 5   mFile.WriteString(string); 6   mFile.Close();

 

 4.臨時檔案的使用---GetTempFileName()
  正規軟體經常用到臨時檔案,你經常可以會看到C:\Windows\Temp目錄下有大量的副檔名為tmp的檔案,這些就是程式運行是建立的臨時檔案。臨時檔案的使用方法基本與常規檔案一樣,只是檔案名稱應該調用函數GetTempFileName()獲得。它的第一個參數是建立此臨時檔案的路徑,第二個參數是建立臨時檔案名稱的首碼,第四個參數用於得到建立的臨時檔案名稱。得到此臨時檔案名稱以後,你就可以用它來建立並操作檔案了,如: 

1   char szTempPath[_MAX_PATH],szTempfile[_MAX_PATH]; 2   GetTempPath(_MAX_PATH, szTempPath); 3   GetTempFileName(szTempPath,_T ("my_"),0,szTempfile); 4   CFile m_tempFile(szTempfile,CFile:: modeCreate|CFile:: modeWrite); 5   char m_char=‘a‘; 6   m_tempFile.Write(&m_char,2); 7   m_tempFile.Close(); 

 

5.檔案的複製、刪除等 
  MFC中沒有提供直接進行這些操作的功能,因而要使用SDK。SDK中的檔案相關函數常用的有CopyFile()、CreateDirectory()、DeleteFile()、MoveFile()。它們的用法很簡單,可參考MSDN。

 

*************************************************************************
××××××××××第二、VC有關檔案操作,參考資料2
*************************************************************************
如何進行檔案操作

[1]顯示對話方塊,取得檔案名稱

CString FilePathName;
CFileDialog dlg(TRUE);///TRUE為OPEN對話方塊,FALSE為SAVE AS對話方塊
if (dlg.DoModal() == IDOK)
FilePathName=dlg.GetPathName();

相關資訊:CFileDialog 用於取檔案名稱的幾個成員函數:

假如選擇的檔案是C:\WINDOWS\TEST.EXE,則
(1)GetPathName();取檔案名稱全稱,包括完整路徑。取回C:\WINDOWS\TEST.EXE
(2)GetFileTitle();取檔案全名:TEST.EXE
(3)GetFileName();取回TEST
(4)GetFileExt();取副檔名EXE

[2]開啟檔案
CFile file("C:\HELLO.TXT",CFile::modeRead);//唯讀方式開啟
//CFile::modeRead可改為 CFile::modeWrite(唯寫),
//CFile::modeReadWrite(讀寫),CFile::modeCreate(建立)
例子:
{
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();

 

***********************************************************************
××××××××××第三、VC有關檔案操作,參考資料3
***********************************************************************

VC++中以追加方式向文字檔寫入資料---CStdioFile

在VB、Asp中向文字檔追加資料很容易,只要設定一個參數為ForAppending就行了。

 1 Sub OpenTextFileTest 2  3    Const ForReading = 1, ForWriting = 2, ForAppending = 8 4  5    Dim fso, f 6  7    Set fso = CreateObject("Scripting.FileSystemObject") 8  9    Set f = fso.OpenTextFile("c:\testfile.txt", ForWriting, True)10 11    f.Write "Hello world!"12 13    f.Close14 15 End Sub

在c語言中,追加資料也比較簡單,好像設定a+參數就可以了。今天,我要用MFC中的CStdioFile類進行檔案操作,讀寫等。

可是,看了下好像沒有簡單的方法,於是在網上看到這樣的寫法:

1 CStdioFile file(strFile,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);2 3 file.WriteString(strTmp);4 5 file.Close;

modeNoTruncate的意思就是不要截取的意思吧。可是,試了下這段代碼,並沒有起作用,不知道是什麼原因。

於是,在WriteString寫字串之前加了個把指標先定位到檔案末尾的代碼,就可以了

1 CString strTmp="hehe\r\n";2  3 CStdioFile file(strFile,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);4 5 file.SeekToEnd();//先定位到檔案尾部6 7 file.WriteString(strTmp);8 9 file.Close;

 

整理自:http://www.cnblogs.com/lidabo/p/3470085.html

VC++中檔案操作(一)---CFileFind,CFileDialog,CFile,CArchive,CStdioFile

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.