Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przykładowy kod w tym temacie pokazuje, jak otwierać i zamykać pliki, odczytywać i zapisywać w plikach oraz blokować i odblokowywać pliki.
W tym przykładzie aplikacja dołącza jeden plik na końcu innego pliku. Najpierw aplikacja otwiera dołączany plik z uprawnieniami, które zezwalają tylko aplikacji na zapisywanie w nim. Jednak podczas procesu dołączania inne procesy mogą otwierać plik z uprawnieniami tylko do odczytu, co zapewnia widok migawki dołączanego pliku. Następnie plik jest zablokowany podczas rzeczywistego procesu dołączania, aby zapewnić integralność danych zapisywanych w pliku.
W tym przykładzie nie są używane transakcje. Gdybyś korzystał z operacji transakcyjnych, miałbyś dostęp jedynie do odczytu. W takim przypadku dane dołączone będą widoczne tylko po zakończeniu operacji zatwierdzania transakcji.
W przykładzie pokazano również, że aplikacja otwiera dwa pliki przy użyciu CreateFile:
- One.txt jest otwarty do odczytu.
- Two.txt jest otwarty do pisania i udostępniania czytania.
Następnie aplikacja używa ReadFile i WriteFile, aby dołączyć zawartość One.txt na końcu Two.txt, odczytując i zapisując bloki 4 KB. Jednak przed zapisaniem w drugim pliku aplikacja używa SetFilePointer, aby ustawić wskaźnik drugiego pliku na końcu tego pliku i używa LockFile, aby zablokować obszar do zapisania. Zapobiega to innemu wątkowi lub procesowi z uchwytem zduplikowanym uzyskiwaniu dostępu do obszaru, gdy operacja zapisu jest w toku. Po zakończeniu każdej operacji zapisu UnlockFile jest używany do odblokowania zablokowanego obszaru.
#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);
}