WriteFileとReadFile

5210 ワード

WriteFile関数:
この関数の機能は、同期および非同期操作を完了するために使用できるファイルにデータを書き込むことです.書き込み位置はファイルポインタによって作成された文字であり、書き込み操作が完了すると、ファイルのポインタはファイルが新たに追加されたバイトの最後に移動する(もちろん、ファイルが開く方法はFILE_FLAG_OVERLPPEDではない).
関数のプロトタイプ:
BOOL WriteFile( HANDLE hFile// handle to file LPCVOID lpBuffer// data buffer DWORDnNumberOfBytesToWrite// number of bytes to write LPDWORD lpNumberOfBytesWritten// number of bytes written LPOVERLAPPED lpOverlapped // overlapped buffer );
        TRUE,    FALSE。
hFile——         。
lpBuffer—— LPCVOID ,                ,                ,     “&”     。
nNumberOfBytesToWrite——
lpNumberOfBytesWritten——        。
lpOverlapped——    OVERLAPPED  。       NULL。

 
関数#カンスウ#
WriteFile
および
ReadFile
次のように宣言します.
WINBASEAPI
BOOL
WINAPI
WriteFile(
    __in        HANDLE hFile,
    __in_bcount(nNumberOfBytesToWrite) LPCVOID lpBuffer,
    __in        DWORD nNumberOfBytesToWrite,
    __out_opt   LPDWORD lpNumberOfBytesWritten,
    __inout_opt LPOVERLAPPED lpOverlapped
    );
   
WINBASEAPI
BOOL
WINAPI
ReadFile(
    __in        HANDLE hFile,
    __out_bcount_part(nNumberOfBytesToRead, *lpNumberOfBytesRead) LPVOID lpBuffer,
    __in        DWORD nNumberOfBytesToRead,
    __out_opt   LPDWORD lpNumberOfBytesRead,
    __inout_opt LPOVERLAPPED lpOverlapped
    );
 
hFile
ファイルハンドルです.
lpBuffer
読み取り/書き込みデータバッファです.
nNumberOfBytesToWrite
どのくらいのデータが書き込まれますか.
lpNumberOfBytesWritten
は、どのくらいのデータが書き込まれているかです.
nNumberOfBytesToRead
どれだけのデータを読み込むか.
nNumberOfBytesToRead
は、すでに読み込まれたデータの数です.
lpOverlapped
非同期読み書きの構造です.
 
 
呼び出し関数の例は次のとおりです.
#001  //
ファイルを作成、書き込み、読み込みします.
#002  //
蔡軍生
 2007/10/21 QQ:9073204 
深セン
#003  void CreateFileDemo(void)
#004  {
#005         //
#006         HANDLE hFile =::CreateFile(_T("CreateFileDemo.txt"),     //
ファイルの名前を作成します.
#007               GENERIC_WRITE|GENERIC_READ,          // 
ファイルの書き込みと読み取り.
#008               0,                      // 
読み書きを共有しません.
#009               NULL,                   // 
デフォルトのセキュリティ属性.
#010               CREATE_ALWAYS,          // 
ファイルが存在する場合は、ファイルも作成されます.
#011               FILE_ATTRIBUTE_NORMAL,// 
一般的なファイル.
      
#012               NULL);                 // 
テンプレートファイルが空です.
#013 
#014         if (hFile == INVALID_HANDLE_VALUE)
#015         {
#016               //
#017               OutputDebugString(_T("CreateFile fail!/r/n"));
#018         }
#019 
#020         //
書類にデータを書く.
#021         const int BUFSIZE = 4096;
#022         char chBuffer[BUFSIZE];         
#023         memcpy(chBuffer,"Test",4);
#024         DWORD dwWritenSize = 0;
#025        BOOL bRet =::WriteFile(hFile,chBuffer,4,&dwWritenSize,NULL);
#026         if (bRet)
#027         {
#028               //
#029               OutputDebugString(_T("WriteFile 
ファイルの書き込みに成功しました
/r/n"));
#030         }
#031 
#032         //
まず、書き込みファイルバッファのデータをディスクに強制的に書き込みます.
#033         FlushFileBuffers(hFile);
#034 
#035         //
#036         //
ファイルからデータを読み込みます.
#037         LONG lDistance = 0;
#038         DWORD dwPtr = SetFilePointer(hFile, lDistance, NULL, FILE_BEGIN);
#039         if (dwPtr == INVALID_SET_FILE_POINTER)
#040         {
#041               //
エラーコードを取得します.
#042               DWORD dwError = GetLastError() ;
#043               //
処理エラー.
           
#044         }
#045 
#046         DWORD dwReadSize = 0;
#047        bRet =::ReadFile(hFile,chBuffer,4,&dwReadSize,NULL);
#048         if (bRet)
#049         {
#050               //
#051               OutputDebugString(_T("ReadFile 
ファイルの読み込みに成功しました
/r/n"));
#052         }
#053         else
#054         {
#055               //
エラーコードを取得します.
#056               DWORD dwError = GetLastError();
#057               //
処理エラー.
           
#058               TCHAR chErrorBuf[1024];
#059               wsprintf(chErrorBuf,_T("GetLastError()=%d/r/n"),dwError);
#060               OutputDebugString(chErrorBuf);
#061         }
#062 
#063  }