Anexando um arquivo a outro arquivo

O exemplo de código neste tópico mostra como abrir e fechar arquivos, ler e gravar em arquivos e bloquear e desbloquear arquivos.

No exemplo, o aplicativo acrescenta um arquivo ao final de outro arquivo. Primeiro, o aplicativo abre o arquivo que está sendo acrescentado com permissões que permitem que apenas o aplicativo escreva nele. No entanto, durante o processo de acréscimo, outros processos podem abrir o arquivo com permissão somente leitura, que fornece uma exibição instantâneo do arquivo que está sendo acrescentado. Em seguida, o arquivo é bloqueado durante o processo de acréscimo real para garantir a integridade dos dados que estão sendo gravados no arquivo.

Este exemplo não usa transações. Se você estivesse usando operações transacionadas, só teria acesso somente leitura. Nesse caso, você só verá os dados acrescentados após a conclusão da operação de confirmação de transação.

O exemplo também mostra que o aplicativo abre dois arquivos usando CreateFile:

  • One.txt está aberto para leitura.
  • Two.txt é aberto para escrita e leitura compartilhada.

Em seguida, o aplicativo usa ReadFile e WriteFile para acrescentar o conteúdo de One.txt ao final do Two.txt lendo e gravando os blocos de 4 KB. No entanto, antes de gravar no segundo arquivo, o aplicativo usa SetFilePointer para definir o ponteiro do segundo arquivo para o final desse arquivo e usa LockFile para bloquear a área a ser gravada. Isso impede que outro thread ou processo com um identificador duplicado acesse a área enquanto a operação de gravação está em andamento. Quando cada operação de gravação é concluída, UnlockFile é usado para desbloquear a área bloqueada.

#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);
}