文件操作
應用程序中很多時(shí)候需要創(chuàng )建、打開(kāi)不同格式的文件,存儲或者讀取不同格式的數據信息。
——————————————————————————————————
一 使用Windows CE提供的API函數
1> 創(chuàng )建/打開(kāi)文件
HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); 參數含義:
lpFileName:創(chuàng )建/打開(kāi)文件的文件名,需要包括其完整路徑。
dwDesiredAccess:指定文件的訪(fǎng)問(wèn)權限,如可讀,可寫(xiě)。(詳見(jiàn)表1)
GENERIC_READ
可讀
GENERIC_WRITE
可寫(xiě)
GENERIC_WRITE | GENERIC_READ
可讀可寫(xiě)
0
不可讀不可寫(xiě),只能獲取文件屬性
表1
dwShareMode:在本進(jìn)程創(chuàng )建或者打開(kāi)一個(gè)文件后(未關(guān)閉之前),其他進(jìn)程是否還可以具有訪(fǎng)問(wèn)該文件的權限,由此參數設定。(詳見(jiàn)表2)
FILE_SHARE_WRITE
其他進(jìn)程打開(kāi)文件時(shí)的訪(fǎng)問(wèn)權限為只寫(xiě)時(shí),成功
FILE_SHARE_READ
其他進(jìn)程打開(kāi)文件時(shí)的訪(fǎng)問(wèn)權限為只讀時(shí),成功
0
在該文件的句柄被關(guān)閉之前,不能夠被共享,也不能夠被打開(kāi)
表2
lpSecurityAttributes:指定文件訪(fǎng)問(wèn)的安全屬性,Windows CE下不支持該參數,因此設置為NULL。
dwCreationDisposition:指定創(chuàng )建/打開(kāi)文件的方式。(詳見(jiàn)表3)
GREATE_NEW
創(chuàng )建一個(gè)新文件,如果文件已經(jīng)存在,則函數執行失敗
GREATE_ALWAYS
創(chuàng )建一個(gè)文件,如果文件已經(jīng)存在,則覆蓋此文件,并清空已經(jīng)存在的屬性
OPEN_EXISTING
打開(kāi)一個(gè)已經(jīng)存在的文件,如果文件不存在,則函數執行失敗
OPEN_ALWAYS
打開(kāi)一個(gè)已經(jīng)存在的文件,如果文件不存在,則創(chuàng )建一個(gè)新文件
TRUNCATE_EXISTING
打開(kāi)一個(gè)已經(jīng)存在的文件,并將其截斷到0字節,如果文件不存在,則函數執行失敗
表3
注:該參數設置為T(mén)RUNCATE_EXISTING,有一個(gè)必要的條件:dwDesiredAccess參數必須設置為GENERIC_WRITE。
dwFlagsAndAttributes:指定文件屬性。(詳見(jiàn)表4)
FILE_ATTRIBUTE_ARCHIVE
存檔
FILE_ATTRIBUTE_HIDDEN
隱藏
FILE_ATTRIBUTE_NORMAL
默認屬性
FILE_ATTRIBUTE_READONLY
只讀
FILE_ATTRIBUTE_SYSTEM
系統屬性,表明該文件對系統操作很重要
表4
hTemplateFile:Windows CE中不支持,設為0。
返回值:成功,返回文件句柄,失敗則返回INVALID_HANDLE_VALUE。如果調用失敗,通過(guò)GetLastError函數查看失敗原因。
2> 關(guān)閉文件
BOOL CloseHandle( HANDLE hObject); 參數含義:
hObject:文件的句柄,CreateFile函數的返回值。
返回值:成功,返回非零值;失敗,返回零值。
3> 讀取文件
BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped); 參數含義:
hFile:文件句柄。
lpBuffer:指定接收數據緩沖區。
nNumberOfBytesToRead:要讀取的字節數。
lpNumberOfBytesRead:實(shí)際讀取的字節數。
lpOverlapped:Windows CE不支持,設置為NULL。
返回值:成功返回TRUE,失敗返回FALSE。
4> 寫(xiě)入文件
BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);參數含義:
hFile:文件句柄。
lpBuffer:指定寫(xiě)入數據緩沖區。
nNumberOfBytesToRead:要寫(xiě)入文件的字節數。
lpNumberOfBytesRead:實(shí)際寫(xiě)入文件的字節數。
lpOverlapped:Windows CE不支持,設置為NULL。
返回值:成功返回TRUE,失敗返回FALSE。
5> 文件指針的移動(dòng)
讀寫(xiě)文件之前,可以通過(guò)指針的移動(dòng)來(lái)設置讀寫(xiě)文件的位置。
DWORD SetFilePointer( HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);參數含義:
hFile:文件句柄。
lDistanceToMove:指定(有符號32位)偏移量。
lpDistanceToMoveHigh:指定一個(gè)輔助的32位偏移量,它在文件指針移動(dòng)距離超出4G時(shí)開(kāi)始使用。否則設置為NULL。
dwMoveMethod:(詳見(jiàn)表5)
FILE_BEGIN
從文件首部開(kāi)始計算偏移量
FILE_CURRENT
從文件當前位置開(kāi)始計算偏移量
FILE_END
從文件的末尾位置開(kāi)始計算
表5
返回值:為了更容易理解,這里引用MSDN原文并給出中文解釋。
——————————————————————————————————
If the SetFilePointer function succeeds and lpDistanceToMoveHigh is NULL, the return value is the low order DWORD of the new file pointer.
If lpDistanceToMoveHigh is not NULL, the function returns the low order DWORD of the new file pointer, and puts the high order DWORD of the new file pointer into the LONG pointed to by that parameter.
If the function fails and lpDistanceToMoveHigh is NULL, the return value is INVALID_SET_FILE_POINTER. To get extended error information, call GetLastError.
If the function fails, and lpDistanceToMoveHigh is not NULL, the return value is INVALID_SET_FILE_POINTER. However, because INVALID_SET_FILE_POINTER is a valid value for the low order DWORD of the new file pointer, you must check GetLastError to determine whether or not an error occurred. If an error occurred, GetLastError returns a value different from NO_ERROR.
——————————————————————————————————
注:假如函數執行成功,并且lpDistanceToMoveHigh參數設置為NULL,返回值為新的文件指針的低32位值。假如lpDistanceToMoveHigh參數不為NULL,函數返回新的文件指針的低32位數值,高32位數值裝載進(jìn)參數指向的變量。假如函數執行失敗并且lpDistanceToMoveHigh參數為NULL,則返回INVALID_SET_FILE_POINTER,可以通過(guò)調用GetLastError函數來(lái)獲取進(jìn)一步的錯誤信息。假如函數執行失敗并且lpDistanceToMoveHigh參數不為NULL,返回值仍為INVALID_SET_FILE_POINTER。但是,由于“INVALID_SET_FILE_POINTER”本身是一個(gè)新的文件指針雙字節值的低位有效的值,所以必須通過(guò)調用GetLastError函數來(lái)查看是否有錯誤發(fā)生。如果發(fā)生了錯誤,GetLastError函數將返回錯誤信息(非NO_ERROR)。
6> 獲取文件信息
DWORD GetFileAttributes( LPCTSTR lpFileName); 參數含義:
lpFileName:文件名。
返回值:函數執行成功返回DWORD類(lèi)型的文件屬性值(詳見(jiàn)表6),如果失敗則返回0xFFFFFFFF。
FILE_ATTRIBUTE_ARCHIVE
此文件或目錄具有存檔屬性,應用程序將根據此屬性標識此文件或目錄是否備份或刪除
FILE_ATTRIBUTE_COMPRESSED
此文件或者目錄是壓縮的。對于一個(gè)文件來(lái)說(shuō),文件中的內容是被壓縮的。對于一個(gè)目錄來(lái)說(shuō),它其中的文件或者子目錄被新建時(shí),默認是壓縮的
FILE_ATTRIBUTE_DIRECTORY
表明lpFileName參數所指定的是一個(gè)目錄,而不是一個(gè)文件
FILE_ATTRIBUTE_ENCRYPTED
文件或者目錄是被加密的。對于一個(gè)文件來(lái)說(shuō),文件中的內容是被加密的。對于一個(gè)目錄來(lái)說(shuō),它其中的文件或者子目錄被新建時(shí),默認加密
FILE_ATTRIBUTE_HIDDEN
文件或目錄是隱藏的
FILE_ATTRIBUTE_NORMAL
正常屬性
FILE_ATTRIBUTE_READONLY
文件或者目錄是只讀的
FILE_ATTRIBUTE_SPARSE_FILE
此文件是一個(gè)稀少文件
FILE_ATTRIBUTE_SYSTEM
文件或者目錄是系統的一部分或者專(zhuān)門(mén)被系統調用的
FILE_ATTRIBUTE_TEMPORARY
文件被當做臨時(shí)文件使用
FILE_ATTRIBUTE_ROMSTATICREF
表示這個(gè)DLL模塊被靜態(tài)鏈接到ROM中別的模塊。此DLL不能被別的位置具有相同文件名的模塊所取代
FILE_ATTRIBUTE_ROMMODULE
文件是ROM的一個(gè)可執行文件,該文件被格式化為可以加載以立刻執行。此文件不能夠通過(guò)CreateFile函數打開(kāi)
表6
7> 設置文件屬性
BOOL SetFileAttributes( LPCTSTR lpFileName, DWORD dwFileAttributes); 參數含義:
lpFileName:文件名。
dwFileAttributes:文件屬性。
返回值:成功返回非零值,失敗返回零。
8> 獲取文件時(shí)間
Windows CE的文件時(shí)間包括三種,分別是文件的創(chuàng )建時(shí)間,文件最后一次被訪(fǎng)問(wèn)的時(shí)間(包括讀取,寫(xiě)入和執行)和文件最后一次被修改的時(shí)間。
BOOL GetFileTime( HANDLE hFile, LPFILETIME lpCreationTime, LPFILETIME lpLastAccessTime, LPFILETIME lpLastWriteTime); 參數含義:
hFile:文件句柄。
lpCreationTime:文件的創(chuàng )建時(shí)間。
lpLastAccessTime:文件最后一次被訪(fǎng)問(wèn)的時(shí)間。
lpLastWriteTime:文件最后一次被修改的時(shí)間。
返回值:成功返回非零值,失敗返回零。
9> 設置文件時(shí)間
BOOL SetFileTime( HANDLE hFile, const FILETIME* lpCreationTime, const FILETIME* lpLastAccessTime, const FILETIME* lpLastWriteTime); 參數含義:
hFile:文件句柄。
lpCreationTime:文件的創(chuàng )建時(shí)間。
lpLastAccessTime:文件最后一次被訪(fǎng)問(wèn)的時(shí)間。
lpLastWriteTime:文件最后一次被修改的時(shí)間。
返回值:成功返回非零值,失敗返回零。
10> 獲取文件大小
DWORD GetFileSize( HANDLE hFile, LPDWORD lpFileSizeHigh); 參數含義:
hFile:文件句柄。
lpFileSizeHigh:指定存儲文件大小的高32位,如果不需要處理超過(guò)4GB大小的文件,設置為NULL。
返回值:函數執行成功,返回表示文件大小的低32位數值。如果參數lpFileSizeHigh設置為NULL,函數的返回值是0xFFFFFFFF時(shí),表示獲取文件大小失敗。如果參數lpFileSizeHigh未被設置為NULL,但是調用此函數后,lpFileSizeHigh的值為0xFFFFFFF,也表示函數執行失敗。
一般情況下很少會(huì )處理大于4GB的文件,因此lpFileSizeHigh參數大多被設置為NULL,函數返回值直接表示文件的大小。
二 MFC模板中封裝的CFILE文件操作類(lèi)
1> 創(chuàng )建/打開(kāi)文件
—————————————————————————————————
virtual BOOL Open(
LPCTSTR lpszFileName,
UINT nOpenFlags,
CFileException* pError = NULL
);
—————————————————————————
2> 關(guān)閉文件
—————————————————————————
virtual void Close( );
—————————————————————————
3> 讀取文件
—————————————————————————
virtual UINT Read(
void* lpBuf,
UINT nCount
);
—————————————————————————
4> 寫(xiě)入文件
—————————————————————————
virtual void Write(
const void* lpBuf,
UINT nCount
);
—————————————————————————
5> 文件指針的移動(dòng)
—————————————————————————
virtual ULONGLONG Seek(
LONGLONG lOff,
UINT nFrom
);
void SeekToBegin( );
ULONGLONG SeekToEnd( );
—————————————————————————