CreateFile,SetFilePointer,WriteFile函數介紹

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^3122G2),因爲所有文件指針的值是有符號的。因此,就算文件只有很少的機會能夠達到這個大小,我們最好還是把文件當成是一個大文件,並且在程序中使用64位的指針(就是lpDistanceToMoveHigh的值不是NULL)。如果我們有一個壓縮的並且文件很少的NTFS文件系統中,即使當前盤的空間不是很大的情況下,也很可能會有一些大文件。

假如lpDistanceToMoveHigh傳入的不是NULL,那麼lpDistanceToMoveHighlDistanceToMove會組成一個有符號的64位值。lDistanceToMove參數是被作爲這個值的低32們,lpDistanceToMoveHigh作爲高32位,也就是說lpDistanceToMoveHighlDistanceToMove的符號擴展名。

爲了從0移動到2G位置,lpDistanceToMoveHigh必須設置爲NULL或當作lDistanceToMove的符號擴展名。爲了移動到大於2G的位置,就要使用lpDistanceToMoveHighlDistanceToMove合成一個有符號的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章