Partilhar via


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 anexado com permissões que permitem que apenas o aplicativo grave nele. No entanto, durante o processo de acréscimo, outros processos podem abrir o arquivo com permissão somente leitura, que fornece uma visualização instantânea 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 estivesse a usar operações transacionadas, só poderia ter acesso de leitura. Nesse caso, você só verá os dados anexados após a conclusão da operação de confirmação da transação.

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

  • One.txt está aberto para leitura.
  • Two.txt está 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);
}