CreateFile
CreateFile 函數創建或打開下列對象,並返回一個可以用來訪問這些對象的句柄。
文件,pipes,郵槽,通信資源,磁盤驅動器(僅windowsNT ),控制檯,文件夾(僅用於打開)
HANDLE CreateFile(
LPCTSTR lpFileName, // 指向文件名的指針
DWORD dwDesiredAccess, // 訪問模式(寫 / 讀)
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全屬性的指針
DWORD dwCreationDisposition, // 如何創建
DWORD dwFlagsAndAttributes, // 文件屬性
HANDLE hTemplateFile // 用於複製文件句柄
);
參數類型及說明
lpFileName要打開的文件的名字
dwDesiredAccess如果爲 GENERIC_READ 表示允許對設備進行讀訪問;如果爲 GENERIC_WRITE 表示允許對設備進行寫訪問(可組合使用);如果爲零,表示只允許獲取與一個設備有關的信息
dwShareMode零表示不共享; FILE_SHARE_READ 和 / 或 FILE_SHARE_WRITE 表示允許對文件進行共享訪問
lpSecurityAttributes SECURITY_ATTRIBUTES ,指向一個 SECURITY_ATTRIBUTES 結構的指針,定義了文件的安全特性(如果操作系統支持的話)
dwCreationDisposition下述常數之一:
CREATE_NEW創建文件;如文件存在則會出錯
CREATE_ALWAYS創建文件,會改寫前一個文件
OPEN_EXISTING文件必須已經存在。由設備提出要求
OPEN_ALWAYS如文件不存在則創建它
TRUNCATE_EXISTING講現有文件縮短爲零長度
dwFlagsAndAttributes一個或多個下述常數
FILE_ATTRIBUTE_ARCHIVE標記歸檔屬性
FILE_ATTRIBUTE_COMPRESSED將文件標記爲已壓縮,或者標記爲文件在目錄中的默認壓縮方式
FILE_ATTRIBUTE_NORMAL默認屬性
FILE_ATTRIBUTE_HIDDEN隱藏文件或目錄
FILE_ATTRIBUTE_READONLY文件爲只讀
FILE_ATTRIBUTE_SYSTEM文件爲系統文件
FILE_FLAG_WRITE_THROUGH操作系統不得推遲對文件的寫操作
FILE_FLAG_OVERLAPPED允許對文件進行重疊操作
FILE_FLAG_NO_BUFFERING禁止對文件進行緩衝處理。文件只能寫入磁盤卷的扇區塊
FILE_FLAG_RANDOM_ACCESS針對隨機訪問對文件緩衝進行優化
FILE_FLAG_SEQUENTIAL_SCAN針對連續訪問對文件緩衝進行優化
FILE_FLAG_DELETE_ON_CLOSE關閉了上一次打開的句柄後,將文件刪除。特別適合臨時文件
也可在 Windows NT 下組合使用下述常數標記:
SECURITY_ANONYMOUS , SECURITY_IDENTIFICATION , SECURITY_IMPERSONATION , SECURITY_DELEGATION , SECURITY_CONTEXT_TRACKING , SECURITY_EFFECTIVE_ONLY
hTemplateFile如果不爲零,則指定一個文件句柄。新文件將從這個文件中複製擴展屬性
返回值
如執行成功,則返回文件句柄。 INVALID_HANDLE_VALUE 表示出錯,會設置 GetLastError 。即使函數成功,但若文件存在,且指定了 CREATE_ALWAYS 或 OPEN_ALWAYS , GetLastError 也會設爲 ERROR_ALREADY_EXISTS
SetFilePointer:
DWORD SetFilePointer(
HANDLE hFile,
LONG lDistanceToMove,
PLONG lpDistanceToMoveHigh,
DWORD dwMoveMethod
);
文中對於第二個和第三個參數進行了詳細的說明:
lpDistanceToMoveHigh 參數是用來管理大文件,如果要移到文件中任何位置,我們就必須設置這個參數的值。假如我們傳入NULL值,那麼lDistanceToMove 的最大值是2^31–2(2G-2),因爲所有文件指針的值是有符號的。因此,就算文件只有很少的機會能夠達到這個大小,我們最好還是把文件當成是一個大文件,並且在程序中使用64位的指針(就是lpDistanceToMoveHigh的值不是NULL)。如果我們有一個壓縮的並且文件很少的NTFS文件系統中,即使當前盤的空間不是很大的情況下,也很可能會有一些大文件。
假如lpDistanceToMoveHigh傳入的不是NULL,那麼lpDistanceToMoveHigh和lDistanceToMove會組成一個有符號的64位值。lDistanceToMove參數是被作爲這個值的低32們,lpDistanceToMoveHigh作爲高32位,也就是說lpDistanceToMoveHigh是lDistanceToMove的符號擴展名。
爲了從0移動到2G位置,lpDistanceToMoveHigh必須設置爲NULL或當作lDistanceToMove的符號擴展名。爲了移動到大於2G的位置,就要使用lpDistanceToMoveHigh和lDistanceToMove合成一個有符號的64位值。舉個例子:爲了從2G位置移到4G的位置,我們需要設置lpDistanceToMoveHigh的值爲0或-1,讓它作爲lDistanceToMove的符號擴展名。
爲了支持64位文件指針,你可以傳一個LONG,把它當作64位文件指針的高位,並把它傳給lpDistanceToMoveHigh。這就意味着你必須把兩個不同的變量當作一個操作單元,要不然這可能會出錯。最好還是使用LARGE_INTEGER結構來創建一個64位值,並且把其中兩個union元素作爲參數傳入。
當然,最好還是寫一個函數來替代SetFilePointer。下面是一個代碼例子,用來演示你想要的功能。
__int64 myFileSeek (HANDLE hf, __int64 distance, DWORD MoveMethod)
{
LARGE_INTEGER li;
li.QuadPart = distance;
li.LowPart = SetFilePointer (hf,
li.LowPart,
&li.HighPart,
MoveMethod);
if (li.LowPart == INVALID_SET_FILE_POINTER && GetLastError()
!= NO_ERROR)
{
li.QuadPart = -1;
}
return li.QuadPart;
}
WriteFile:
BOOL WriteFile(
HANDLEhFile,//文件句柄
LPCVOIDlpBuffer,//數據緩存區指針
DWORDnNumberOfBytesToWrite,//你要寫的字節數
LPDWORDlpNumberOfBytesWritten,//用於保存實際寫入字節數的存儲區域的指針
LPOVERLAPPEDlpOverlapped//OVERLAPPED結構體指針
);
從文件指針指向的位置開始將數據寫入到一個文件中, 且支持同步和異步操作,
如果文件打開方式沒有指明FILE_FLAG_OVERLAPPED的話,當程序調用成功時,它將實際寫入文件的字節數保存到lpNumberOfBytesWriten指明的地址空間中
如果文件要交互使用的話,當函數調用完畢時要記得調整文件指針
參數說明
HANDLE hFile, 需要寫入數據的文件指針,這個指針指向的文件必須是GENERIC_WRITE access 訪問屬性的文件
LPOVERLAPPED lpOverlapped OVERLAPPED結構體指針,如果文件是以FILE_FLAG_OVERLAPPED方式打開的話,那麼這個指針就不能爲NULL
vc返回值
調用成功,返回非0
調用不成功,返回爲0