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