Menambahkan Satu File ke File Lain

Contoh kode dalam topik ini menunjukkan kepada Anda cara membuka dan menutup file, membaca dan menulis ke file, serta mengunci dan membuka kunci file.

Dalam contoh, aplikasi menambahkan satu file ke akhir file lain. Pertama, aplikasi membuka file yang ditambahkan dengan izin yang hanya memungkinkan aplikasi untuk menulisnya. Namun, selama proses penambahan, proses lain dapat membuka file dengan izin baca-saja, yang menyediakan tampilan rekam jepret file yang ditambahkan. Kemudian, file dikunci selama proses penambalan aktual untuk memastikan integritas data yang ditulis ke file.

Contoh ini tidak menggunakan transaksi. Jika Anda menggunakan operasi yang ditransaksikan, Anda hanya akan dapat memiliki akses baca-saja. Dalam hal ini, Anda hanya akan melihat data yang ditambahkan setelah operasi penerapan transaksi selesai.

Contohnya juga menunjukkan bahwa aplikasi membuka dua file dengan menggunakan CreateFile:

  • One.txt dibuka untuk dibaca.
  • Two.txt dibuka untuk menulis dan membaca bersama.

Kemudian aplikasi menggunakan ReadFile dan WriteFile untuk menambahkan konten One.txt ke akhir Two.txt dengan membaca dan menulis blok 4 KB. Namun, sebelum menulis ke file kedua, aplikasi menggunakan SetFilePointer untuk mengatur penunjuk file kedua ke akhir file tersebut, dan menggunakan LockFile untuk mengunci area yang akan ditulis. Ini mencegah utas atau proses lain dengan handel duplikat mengakses area saat operasi tulis sedang berlangsung. Ketika setiap operasi tulis selesai, UnlockFile digunakan untuk membuka kunci area terkunci.

#include <windows.h>
#include <stdio.h>

void main()
{
  HANDLE hFile;
  HANDLE hAppend;
  DWORD  dwBytesRead, dwBytesWritten, dwPos;
  BYTE   buff[4096];

  // Open the existing file.

  hFile = CreateFile(TEXT("one.txt"), // open One.txt
            GENERIC_READ,             // open for reading
            0,                        // do not share
            NULL,                     // no security
            OPEN_EXISTING,            // existing file only
            FILE_ATTRIBUTE_NORMAL,    // normal file
            NULL);                    // no attr. template

  if (hFile == INVALID_HANDLE_VALUE)
  {
     printf("Could not open one.txt."); 
     return;
  }

  // Open the existing file, or if the file does not exist,
  // create a new file.

  hAppend = CreateFile(TEXT("two.txt"), // open Two.txt
              FILE_APPEND_DATA | FILE_GENERIC_READ,    // open for appending and locking
              FILE_SHARE_READ,                         // allow multiple readers
              NULL,                                    // no security
              OPEN_ALWAYS,                             // open or create
              FILE_ATTRIBUTE_NORMAL,                   // normal file
              NULL);                                   // no attr. template

  if (hAppend == INVALID_HANDLE_VALUE)
  {
     printf("Could not open two.txt."); 
     return;
  }

  // Append the first file to the end of the second file.
  // Lock the second file to prevent another process from
  // accessing it while writing to it. Unlock the
  // file when writing is complete.

  while (ReadFile(hFile, buff, sizeof(buff), &dwBytesRead, NULL)
      && dwBytesRead > 0)
    {
    dwPos = SetFilePointer(hAppend, 0, NULL, FILE_END);
    if (!LockFile(hAppend, dwPos, 0, dwBytesRead, 0))
    {
       printf("Could not lock two.txt");
    }
    WriteFile(hAppend, buff, dwBytesRead, &dwBytesWritten, NULL);
    UnlockFile(hAppend, dwPos, 0, dwBytesRead, 0);
    }

  // Close both files.

  CloseHandle(hFile);
  CloseHandle(hAppend);
}