Sdílet prostřednictvím


Připojení jednoho souboru k jinému souboru

Příklad kódu v tomto tématu ukazuje, jak otevírat a zavírat soubory, číst a zapisovat do souborů a zamknout a odemknout soubory.

V příkladu aplikace připojí jeden soubor na konec jiného souboru. Nejprve aplikace otevře soubor, ke kterému se připojuje s oprávněními, která umožňují pouze této aplikaci provádět zápis. Během procesu připojení však mohou ostatní procesy otevřít soubor s oprávněním jen pro čtení, který poskytuje zobrazení snímku připojeného souboru. Pak je soubor uzamčen během skutečného procesu připojení, aby se zajistila integrita zapisovaných dat do souboru.

Tento příklad nepoužívá transakce. Pokud byste používali operace zahrnující transakce, měli byste pouze přístup pro čtení. V tomto případě byste viděli pouze připojená data po dokončení operace potvrzení transakce.

Příklad také ukazuje, že aplikace otevře dva soubory pomocí CreateFile:

  • One.txt je otevřen pro čtení.
  • Two.txt se otevře pro psaní a sdílené čtení.

Aplikace pak použije ReadFile a WriteFile k připojení obsahu One.txt na konec Two.txt čtením a zápisem 4 KB bloků. Před zápisem do druhého souboru však aplikace používá SetFilePointer nastavit ukazatel druhého souboru na konec tohoto souboru a používá LockFile k uzamčení oblasti, která se má zapsat. Tím se zabrání jinému vláknu nebo procesu s duplicitním popisovačem v přístupu k oblasti, zatímco probíhá operace zápisu. Po dokončení každé operace zápisu se k odemknutí uzamčené oblasti použije UnlockFile.

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