Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Kodexemplet i det här avsnittet visar hur du öppnar och stänger filer, läser och skriver till filer och låser och låser upp filer.
I exemplet lägger programmet till en fil i slutet av en annan fil. Först öppnar programmet filen som läggs till med behörigheter som endast tillåter att programmet skriver till den. Men under tilläggsprocessen kan andra processer öppna filen med skrivskyddad behörighet, vilket ger en ögonblicksbildsvy över filen som läggs till. Sedan låses filen under själva tilläggsprocessen för att säkerställa integriteten för de data som skrivs till filen.
Det här exemplet använder inte transaktioner. Om du använder transaktionsåtgärder skulle du bara kunna ha endast läsåtkomst. I det här fallet skulle du bara se de tillagda data när transaktionsbekräftelsen har slutförts.
Exemplet visar också att programmet öppnar två filer med hjälp av CreateFile:
- One.txt öppnas för läsning.
- Two.txt öppnas för skrivning och delad läsning.
Sedan använder programmet ReadFile och WriteFile för att lägga till innehållet i One.txt i slutet av Two.txt genom att läsa och skriva blocken på 4 KB. Innan du skriver till den andra filen använder programmet dock SetFilePointer för att ange pekaren för den andra filen i slutet av filen och använder LockFile för att låsa området som ska skrivas. Detta förhindrar att en annan tråd eller process med ett duplicerat handtag kommer åt området medan skrivåtgärden pågår. När varje skrivåtgärd är klar används UnlockFile för att låsa upp det låsta området.
#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);
}