MFC文件讀寫操作


1、相關類

  CFile類 -封裝了文件句柄以及操作文件的API函數

  CFileFind類 -封裝了文件搜索功能

2、CFile類的使用

  2.1文件讀寫

    1)創建或者打開文件

      CFile::Open

      virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL );

        lpszFileName:指定文件的名稱;

        nOpenFlags:指定文件共享和訪問的方式,包括:

          CFile::modeCreate  --創建新文件,如果該文件已存在,則將它的長度截斷為0;

          CFile::modeNoTruncate  --與CFile::modeCreate合用,如果要創建的文件已存在,它的長度不會被截斷;

          CFile::modeRead  --打開文件,僅用於讀操作;

          CFile::modeReadWrite  --打開文件,可讀可寫;

          CFile::modeWrite  --打開文件,僅用於寫操作;

          CFile::modeNoInherit  --禁止子進程繼承該文件;

          CFile::shareDenyNone  --打開文件,同時並不拒絕其他進程對該文件的讀取和寫入訪問;如果該文件已經被其他進程以兼容模式打開,則函數調用失敗;

          CFile::shareDenyRead  --打開文件,並拒絕其他進程對該文件的讀取訪問;

          CFile::shareDenyWrite  --打開文件,並拒絕其他進程對該文件的寫入訪問;

          CFile::shareExclusive  --以獨占模式打開,拒絕其他進程對該文件的讀取和寫入訪問;

          CFile::typeText  --設置文本模式,帶有一對回車換行字符;

          CFile::typeBinary  --設置二進制模式;

    2)文件讀寫

      CFile::Read

      virtual UINT Read( void* lpBuf, UINT nCount );

        lpBuf:指向用來接收從文件中讀取的數據的緩沖區的指針;

        nCount:要從文件中讀取的最大字節數;

      CFile::Write

      virtual void Write( const void* lpBuf, UINT nCount );

        lpBuf:指向將要被寫入文件的數據;

        nCount:將要寫入的數據的字節數;

      CFile::Flush --刷新緩沖區中的數據並將其寫入磁盤文件中

      virtual void Flush();

    3)關閉文件

      CFile::Close()

      virtual void Close();

  2.2文件長度的獲取和設置

    CFile::GetLength()

    CFile::SetLength(ULONGLONG dwLen)  //文件會響應地被擴展或截取

  2.3文件的指針

    CFile::GetPosition()  --獲得當前文件指針的位置

    virtual DWORD GetPosition( ) const;

    CFile::Seek

    virtual LONG Seek( LONG lOff, UINT nFrom );

      lOff:將移動文件指針多少個字節數;

      nFrom:移動文件指針的起始位置,包括:

        CFile::begin

        CFile::current

        CFile::end

    CFile::SeekToBegin()  //將文件指針移到文件開頭

    CFile::SeekToEnd()  //將文件指針移到文件末尾

  2.4文件相關屬性的讀取和設置

    1)CFile::GetStatus  //獲取文件的屬性信息,成功返回非0,失敗返回0

      Bool GetStatus([LPCTSTR strFileName,]CFileStatus& Status)

        CFileStatus結構有以下字段:

          CTime m_ctime --文件創建的時間

          CTime m_mtime --文件最后一次修改的時間

          CTime m_atime --最后一次訪問文件並讀取的時間

          LONG m_size --文件邏輯長度,以字節數表示

          BYTE m_attribute --文件屬性

            m_attribute的值包括:normal=0x00 | readOnly=0x01 | hidden=0x02 | system=0x04 | volume=0x08 | directory=0x10 | archive=0x20

          Char  m_szFullName[_MAX_PATH] --Windows字符集表示的全文件名

    2)CFile::SetStatus  //設置文件屬性信息

      SetStatus(LPCTSTR strFileName,CFileStatus& Status)

    3)CFile::GetFileName()  //獲取文件名稱,包含擴展名(即使被隱藏)

    4)CFile::GetFileTitle()  //獲取文件顯示名稱(若系統默認隱藏文件擴展名,則不包含擴展名)

    5)CFile::GetFilePath()  //獲取文件絕對路徑

    6)CFile::SetFilePath(strNewFilePathName)

    7)CFile::Rename(strOldFileName,strNewFileName)  //重命名文件,可以利用此函數移動文件到新的路徑下並重命名

    8)CFile::Remove(strFileName)  //刪除指定路徑文件,可以是相對路徑、絕對路徑

  注意:1、文件讀寫需要異常處理

           2、注意文件的指針位置

  

  例:  

 

if (GetFileAttributes("./1.txt") != INVALID_FILE_ATTRIBUTES)  //檢測文件是否存在
{
   CFile file; 
   file.Open("1.txt", CFile::modeCreate | CFile::modeWrite);
//file.Write("hello world!", strlen("hello world!"));
CString str="hello world!";
int strLen=str.GetLength();   file.Write(
str, strLen);   file.Close(); }

 

CFile file;
if(file.Open("1.txt", CFile::modeRead))
{
  char *pBuf;
  DWORD dwFileLen;
  dwFileLen = file.GetLength();
  pBuf = new char[dwFileLen + 1];
  pBuf[dwFileLen] = 0;
  file.Read(pBuf, dwFileLen);
  file.Close();

  MessageBox(pBuf);

  delete[] pBuf;
 
}

 

3、CFileFind類的使用

  3.1開始查找(指定查找的目錄)

    CFileFind::FindFile(strFileName,0);  //strName為要查找的文件名,為NULL表示查找“*.*”

    成功返回非0,失敗返回0

  3.2查找下一個(獲取當前文件信息,返回下一個文件是否存在)

    CFileFind::FindNextFile();  //返回非0表示還有符合條件的下一個文件,返回0表示已是最后一個文件

  3.3獲取/判斷文件信息

    CFileFind::GetCreationTime();  //獲取文件的創建時間,成功返回非0,失敗返回0

      virtual BOOL GetCreationTime(FILETIME *pFileTime) const;  //FILETIME 

 *:容納時間的結構指針

      virtual BOOL GetCreationTime(CTime& refTime) const;  //CTime&:容納時間的對象地址

      FILETIME和CTime的相互轉換:

        FILETIME轉CTime:

          1、CTime對象在初始化時可以傳遞FILETIME結構

            FILETIME ft;

            CTime time(ft);

          2、將FILETIME轉換為SYSTEMTIME,然后CTime對象在初始化時可以傳遞SYSTEMTIME結構

            FILETIME ft;

            SYSTEMTIME st;

            BOOL bSuccess=::FileTimeToSystemTime(&ft , &st);

            CTime time(st);

        CTime轉FILETIME:

          CTime time(CTime::GetCurrentTime());

          SYSTEMTIME st;

          time.GetAsSystemTime(st);

          FILETIME ft;

          ::SystemTimeToFileTime(&st,&ft);

    CFileFind::GetLastAccessTime();  //獲取文件最后被訪問的時間,成功返回非0,失敗返回0

      virtual BOOL GetLastAccessTime(FILETIME *pFileTime) const;

      virtual BOOL GetLastAccessTime(CTime& refTime) const;

    CFileFind::GetLastWriteTime();  //獲取文件最后被修改的時間,成功返回非0,失敗返回0

      virtual BOOL GetLastWriteTime(FILETIME *pFileTime) const;

      virtual BOOL GetLastWriteTime(CTime& refTime) const;

    CFileFind::GetRoot();  //獲取查找到的文件的根目錄,必須在執行FindNextFile()后執行該函數,返回CString對象

    CFileFind::GetFileName();  //獲取查找到的文件的全名(包含擴展名),必須在執行FindNextFile()后執行該函數,返回CString對象

    CFileFind::GetFilePath();  //獲取查找到的文件的絕對路徑,必須在執行FindNextFile()后執行該函數,返回CString對象

    CFileFind::GetFileTitle();  //獲取查找到的文件的名稱(若系統默認隱藏文件擴展名則不顯示),必須在執行FindNextFile()后執行該函數,返回CString對象

    CFileFind::GetFileURL();  //獲取查找到的文件的URL路徑,必須在執行FindNextFile()后執行該函數,返回CString對象

    CFileFind::GetLength();  //獲取查找到的文件的長度DWORD

    CFileFind::IsArchived();  //判斷查找的文件屬性是否是檔案文件,必須在執行FindNextFile()后執行該函數,非0表示是,0表示不是

    CFileFind::IsCompressed();  //判斷查找的文件屬性是否是壓縮文件,必須在執行FindNextFile()后執行該函數

    CFileFind::IsDirectory();  //判斷查找的文件屬性是否為路徑文件(文件夾),必須在執行FindNextFile()后執行該函數

    CFileFind::IsDots();  //判斷查找的文件屬性是否是“.”、“..”,必須在執行FindNextFile()后執行該函數

    CFileFind::IsHidden();  //判斷查找的文件屬性是否為隱藏文件,必須在執行FindNextFile()后執行該函數

    CFileFind::IsNormal();  //判斷查找的文件屬性是否為正常文件,必須在執行FindNextFile()后執行該函數

    CFileFind::IsReadOnly();  //判斷查找的文件屬性是否為只讀文件,必須在執行FindNextFile()后執行該函數

    CFileFind::IsSystem();  //判斷查找的文件屬性是否為系統文件,必須在執行FindNextFile()后執行該函數

    CFileFind::IsTemporary();  //判斷查找的文件屬性是否為臨時文件,必須在執行FindNextFile()后執行該函數

    CFileFind::MatchesMask(DWORD dwMask);  //判斷查找的文件的綜合屬性,必須在執行FindNextFile()后執行該函數

      dwMask參數包括:

        FILE_ATTRIBUTE_ARCHIVE:檔案文件

        FILE_ATTRIBUTE_COMPRESSED:壓縮文件

        FILE_ATTRIBUTE_DIRECTORY:路徑文件

        FILE_ATTRIBUTE_NORMAL:正常文件

        FILE_ATTRIBUTE_READONLY:只讀文件

        FILE_ATTRIBUTE_SYSTEM:系統文件

        FILE_ATTRIBUTE_TEMPORARY:臨時文件

        FILE_ATTRIBUTE_HIDDEN:隱藏文件

  3.4結束查找

    CFileFind::Close();

CFileFind fFinder;
BOOL bFind = fFinder.FindFile(TEXT("D:/*.*"));
while (bFind)
{
    bFind = fFinder.FindNextFile();

    //當前文件夾及上層文件夾(名稱分別為..)-----------------
    if (fFinder.IsDots()) 
    {
        continue;
    }

    //子文件夾---------------------------------------------
    if(fFinder.IsDirectory()) 
    {
        CString cstrDirName = fFinder.GetFileName();  //directory name
        CString cstrDirPath = fFinder.GetFilePath();  //directory path
        continue;
    }

    //文件-------------------------------------------------
    CString cstrFileName = fFinder.GetFileName();   //file name
    CString cstrFilePath = fFinder.GetFilePath();   //file path
}

fFinder.Close();

  

  相關問題:

    CFileFind 類中返回的文件順序與文件系統有關,如果是NTFS和CDFS文件系統,是以文件的字母順序排列的,FAT文件系統下,是以文件增加的先后順序排列的,而不是按字母順序。

    利用CFileFind類查找文件時會出現重復現象,其原因也是跟文件系統類型有關,通常的解決方法:先將CFileFind類查找到的文件全部保存下來,然后再進行處理;切勿交叉處理。另外一種簡單的排序方法:每查到一個文件,隨后將其加入CListBox控件中顯示(CListBox風格中得選中sort),因為CListBox控件有自動排序功能,這樣你所需的文件就自動排序了

    如:

在OnInitDialog()函數中添加如下代碼,再結合ListBox控件用。

CFileFind finder;
BOOL bWorking = finder.FindFile(".\\zwq\\*.txt");
while (bWorking)
{
    bWorking = finder.FindNextFile();
    m_lbSurface.AddString ((LPCTSTR) finder.GetFileName());//m_lbSurface為listbox控件的關聯變量,此句是將文件名添加到listbox中顯示出來。
}

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM