Aggiunta di un file a un altro file

L'esempio di codice in questo argomento illustra come aprire e chiudere file, leggere e scrivere nei file e bloccare e sbloccare i file.

Nell'esempio l'applicazione aggiunge un file alla fine di un altro file. In primo luogo, l'applicazione apre il file aggiunto con autorizzazioni che consentono solo all'applicazione di scrivere. Tuttavia, durante il processo di accodamento altri processi possono aprire il file con autorizzazione di sola lettura, che fornisce una visualizzazione snapshot del file aggiunto. Il file viene quindi bloccato durante il processo di accodamento effettivo per garantire l'integrità dei dati scritti nel file.

In questo esempio non vengono utilizzate transazioni. Se si usano operazioni transazionate, sarà possibile avere accesso in sola lettura. In questo caso, i dati accodati vengono visualizzati solo dopo il completamento dell'operazione di commit della transazione.

L'esempio mostra anche che l'applicazione apre due file usando CreateFile:

  • One.txt viene aperto per la lettura.
  • Two.txt viene aperto per la scrittura e la lettura condivisa.

L'applicazione usa quindi ReadFile e WriteFile per aggiungere il contenuto di One.txt alla fine di Two.txt leggendo e scrivendo i blocchi di 4 KB. Tuttavia, prima di scrivere nel secondo file, l'applicazione usa SetFilePointer per impostare il puntatore del secondo file alla fine del file e usa LockFile per bloccare l'area da scrivere. Ciò impedisce a un altro thread o processo con un handle duplicato di accedere all'area mentre l'operazione di scrittura è in corso. Al termine di ogni operazione di scrittura, UnlockFile viene usato per sbloccare l'area bloccata.

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