Dela via


Skapa ett filmappningsobjekt

Det första steget i att mappa en fil är att öppna filen genom att anropa funktionen CreateFile. För att säkerställa att andra processer inte kan skriva till den del av filen som mappas bör du öppna filen med exklusiv åtkomst. Dessutom bör filhandtaget förbli öppet tills processen inte längre behöver filobjektet. Ett enkelt sätt att få exklusiv åtkomst är att ange noll i parametern fdwShareMode för CreateFile. Handtaget som returneras av CreateFile används av funktionen CreateFileMapping för att skapa ett filavbildningsobjekt.

Funktionen CreateFileMapping returnerar ett handtag till filmappningsobjektet. Det här handtaget används när man skapar en filvy så att du kan komma åt det delade minnet. När du anropar CreateFileMappinganger du ett objektnamn, antalet byte som ska mappas från filen och läs-/skrivbehörigheten för det mappade minnet. Den första processen som anropar CreateFileMapping skapar filsystemobjektet. Processer som anropar CreateFileMapping för ett befintligt objekt får ett handtag till det befintliga objektet. Du kan avgöra om ett lyckat anrop till CreateFileMapping har skapat eller öppnat filmappningsobjekt genom att anropa funktionen GetLastError. GetLastError returnerar NO_ERROR till skapandeprocessen och ERROR_ALREADY_EXISTS till efterföljande processer.

Funktionen CreateFileMapping misslyckas om åtkomstflaggorna är i konflikt med de som angavs när funktionen CreateFile öppnade filen. Om du till exempel vill läsa och skriva till filen:

  • Ange värdena GENERIC_READ och GENERIC_WRITE i parametern fdwAccess för CreateFile.
  • Ange värdet PAGE_READWRITE i parametern fdwProtect för CreateFileMapping.

Att skapa ett filmapplingsobjekt tilldelar inte fysiskt minne, utan reserverar bara det.

Filkartläggningsstorlek

Storleken på filmappningsobjektet är oberoende av storleken på filen som mappas. Men om filkartobjektet är större än filen, expanderar systemet filen innan CreateFileMapping returnerar. Om filmappningsobjektet är mindre än filen mappar systemet endast det angivna antalet byte från filen.

Med dwMaximumSizeHigh och dwMaximumSizeLow parametrar för CreateFileMapping kan du ange antalet byte som ska mappas från filen:

  • När du inte vill att filens storlek ska ändras (till exempel när du mappar skrivskyddade filer) anropar du CreateFileMapping och anger noll för både dwMaximumSizeHigh och dwMaximumSizeLow. När du gör detta skapas ett filmappningsobjekt som är exakt lika stort som filen. Annars måste du beräkna eller uppskatta storleken på den färdiga filen eftersom filmappningsobjekt är statiska i storlek. när de har skapats kan deras storlek inte ökas eller minskas. Ett försök att mappa en fil med längden noll på det här sättet misslyckas med felkoden ERROR_FILE_INVALID. Program bör testa för filer med längden noll och avvisa sådana filer.

  • Storleken på ett filmappningsobjekt som backas upp av en namngiven fil begränsas av diskutrymme. Storleken på en filvy är begränsad till det största tillgängliga sammanhängande blocket med oreserverat virtuellt minne. Detta är högst 2 GB minus det virtuella minne som redan har reserverats av processen.

Storleken på det filmappningsobjekt som du väljer styr hur långt in i filen du kan "se" med minnesmappning. Om du skapar ett filmappningsobjekt som är 500 kB stort har du endast åtkomst till de första 500 kB i filen, oavsett filens storlek. Eftersom det inte kostar dig några systemresurser att skapa ett större filmappningsobjekt skapar du ett filmappningsobjekt som är storleken på filen (ange dwMaximumSizeHigh och dwMaximumSizeLow parametrar för CreateFileMapping båda till noll) även om du inte förväntar dig att visa hela filen. Kostnaden för systemresurser handlar om att skapa vyerna och komma åt dem.

Du kan visa en del av filen som inte startar i början av filen. Mer information finns i Skapa en vy i en fil.

Skapa en filvy

Skapa en vy i en fil