基於WINAPI的檔案操作
WINAPI提供了兩種檔案操作函數,一組是為了和16位程式相容,這種函數比較簡單;而另一種是專門為32位程式設計,在使用時就顯得麻煩些,下面我就把這兩組函數一一介紹:
一、和16位程式相容的一組函數
⑴_lopen
原型:
HFILE _lopen(
LPCSTR lpPathName, // 檔案名稱
int iReadWrite //檔案存取方式
);
功能:開啟檔案,成功返回其控制代碼,與此類似的還有個OpenFile()函數,可自行查閱協助檔案。
參數說明:lpPathName是要開啟的檔案名稱,iReadWrite是檔案存取方式,主要有3種方式:
OF_READ:以唯讀方式開啟
OF_READWRITE:以讀寫方式開啟
OF_WRITE:以唯寫方式開啟
還有如 OF_SHARE_COMPAT 等屬性,由於不太常用,為裡就不一一介紹了。
⑵_lclose()
原型:HFILE _lclose( HFILE hFile);
功能:關閉檔案,成功返回0
參數說明:hFile:要關閉的控制代碼
⑶_lread()
原型:
UINT _lread(
HFILE hFile, // 檔案控制代碼
LPVOID lpBuffer, // 儲存資料的緩衝區
UINT uBytes // 要讀取的長度
);
功能:讀檔案,返回實際讀取的字元數,與此類似的還有個_hread()函數,可自行查閱協助檔案。
⑷_lwrite()
原型:
UINT _lwrite(
HFILE hFile, // 檔案控制代碼
LPCSTR lpBuffer, // 儲存資料的緩衝區
UINT uBytes // 要寫的長度
);
功能:寫檔案,返回實際寫的字元數,與此類似的還有個_hwrite()函數,可自行查閱協助檔案。
⑸_llseek()
原型:
LONG _llseek(
HFILE hFile, // 檔案控制代碼
LONG lOffset, // 移動的量
int iOrigin // 移動的基準位置
);
功能:移動檔案的讀寫位置,成功返回移動後的檔案讀寫位置
參數說明:iOrigin的取值是以下三種情況之一:
FILE_BEGIN:檔案頭部
FILE_CURRENT:檔案當前位置
FILE_END:檔案尾部
⑹_lcreat()
原型:
HFILE _lcreat(
LPCSTR lpPathName, //要建立的檔案名稱
int iAttribute // 檔案屬性
);
功能:建立檔案,成功返回其控制代碼
參數說明:檔案屬性是以下值的和:
0:普通檔案
1:唯讀檔案
2:隱含檔案
4:系統檔案
這幾個函數的用法和所列的BCB庫函數差不多,建議使用BCB的庫函數。可參閱前文基於BCB庫函數的檔案操作。
二、32位程式相容
CreateFile
開啟檔案
要對檔案進行讀寫等操作,首先必須獲得檔案控制代碼,通過該函數可以獲得檔案控制代碼,該函數是通向檔案世界的大門。
ReadFile
從檔案中讀取位元組資訊。
在開啟檔案獲得了檔案控制代碼之後,則可以通過該函數讀取資料。
WriteFile
向檔案寫入位元組資訊。
同樣可以將檔案控制代碼傳給該函數,從而實現對檔案資料的寫入。
CloseHandle
關閉檔案控制代碼。
開啟門之後,自然要記得關上。
GetFileTime
擷取檔案時間。
有三個檔案時間可供擷取:建立時間、最後訪問時間、最後寫時間。
該函數同樣需要檔案控制代碼作為入口參數。
GetFileSize
擷取檔案大小。
由於檔案大小可以高達上數G(1G需要30位),因此一個32位的雙位元組類型無法對其精確表達,因此返回碼錶示低32位,還有一個出口參數可以傳出高32位。
該函數同樣需要檔案控制代碼作為入口參數。
GetFileAttributes
擷取檔案屬性。
可以擷取檔案的存檔、唯讀、系統、隱藏等屬性。
該函數只需一個檔案路徑作為參數。
SetFileAttributes
設定檔案屬性。
能擷取,自然也應該能設定。
可以設定檔案的存檔、唯讀、系統、隱藏等屬性。
該函數只需一個檔案路徑作為參數。
GetFileInformationByHandle
擷取所有檔案資訊
該函數能夠擷取上面所有函數所能夠擷取的資訊,如大小、屬性等,同時還包括一些其他地方無法擷取的資訊,比如:檔案卷標、索引和連結資訊。
該函數需要檔案控制代碼作為入口參數。
GetFullPathName
擷取檔案路徑,該函數擷取檔案的完整路徑名。
需要提醒的是:只有當該檔案在目前的目錄下,結果才正確。如果要得到真正的路徑。應該用GetModuleFileName函數。
CopyFile
複製檔案
注意:只能複製檔案,而不能複製目錄
MoveFileEx
移動檔案
既可以移動檔案,也可以移動目錄,但不能跨越盤符。(Window2000下設定移動標誌可以實現跨越盤符操作)
DeleteFile
刪除檔案
GetTempPath
擷取Windows臨時目錄路徑
GetTempFileName
在Windows臨時目錄路徑下建立一個唯一的臨時檔案
SetFilePoint
移動檔案指標。
該函數用於對檔案進行進階讀寫操作時。
檔案的鎖定和解鎖
LockFile
UnlockFile
LockFileEx
UnlockFileEx
以上四個函數用於對檔案進行鎖定和解鎖。這樣可以實現檔案的非同步作業。可同時對檔案的不同部分進行各自的操作。
檔案的壓縮和解壓縮
LZOpenFile
開啟壓縮檔以讀取
LZSeek
尋找壓縮檔中的一個位置
LZRead
讀一個壓縮檔
LZClose
關閉一個壓縮檔
LZCopy
複製壓縮檔並在處理過程中展開
GetExpandedName
從壓縮檔中返迴文件名稱。
以上六個函數為32位 API 中的一個小擴充庫,檔案壓縮擴充庫中的函數。檔案壓縮可以用命令 compress 建立。
檔案映像/映射
32位 API 提供一個稱為檔案映像/映射的特性,它允許將檔案直接映射為一個應用的虛擬記憶體空間,這一技術可用於簡化和加速檔案訪問。
CreateFileMapping
建立和命名映射
MapViewOfFile
把檔案對應裝載如記憶體
UnmapViewOfFile
釋放視圖並把變化寫迴文件
FlushViewOfFile
將視圖的變化重新整理寫入磁碟