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中顯示出來。 }