Tworzenie obiektu mapowania plików
Pierwszym krokiem mapowania pliku jest otwarcie pliku przez wywołanie funkcji CreateFile. Aby upewnić się, że inne procesy nie mogą zapisywać w części pliku mapowanego, należy otworzyć plik z wyłącznym dostępem. Ponadto dojście do pliku powinno pozostać otwarte, dopóki proces nie będzie już potrzebował obiektu mapowania plików. Łatwym sposobem uzyskania dostępu na wyłączność jest określenie zera w parametrze fdwShareMode CreateFile. Dojście zwrócone przez CreateFile jest używane przez funkcję CreateFileMapping w celu utworzenia obiektu mapowania plików.
Funkcja CreateFileMapping zwraca uchwyt do obiektu mapowania plików. Ten uchwyt będzie używany podczas tworzenia widoku pliku, aby można było uzyskać dostęp do pamięci udostępnionej. Podczas wywoływania metody CreateFileMappingnależy określić nazwę obiektu, liczbę bajtów do zamapowania z pliku oraz uprawnienie do odczytu/zapisu dla zamapowanej pamięci. Pierwszy proces wywołujący CreateFileMapping tworzy obiekt mapowania plików. Procesy wywołujące CreateFileMapping dla już istniejącego obiektu otrzymują uchwyt do tego obiektu. Możesz określić, czy pomyślne wywołanie funkcji CreateFileMapping utworzyło lub otworzyło obiekt mapowania plików, wywołując funkcję GetLastError. getLastError zwraca NO_ERROR do procesu tworzenia i ERROR_ALREADY_EXISTS do kolejnych procesów.
Funkcja CreateFileMapping zawodzi, jeśli flagi dostępu są sprzeczne z tymi określonymi podczas otwierania pliku przez funkcję CreateFile. Aby na przykład odczytywać i zapisywać w pliku:
- Określ wartości GENERIC_READ i GENERIC_WRITE w parametrze fdwAccessCreateFile.
- Określ wartość PAGE_READWRITE w parametrze fdwProtect funkcji CreateFileMapping.
Utworzenie obiektu mapowania plików nie powoduje zatwierdzenia pamięci fizycznej, ale tylko je rezerwuje.
Rozmiar mapowania pliku
Rozmiar obiektu mapowania plików jest niezależny od rozmiaru mapowanego pliku. Jeśli jednak obiekt mapowania plików jest większy niż plik, system rozszerza plik przed zwróceniem CreateFileMapping. Jeśli obiekt mapowania plików jest mniejszy niż plik, system mapuje tylko określoną liczbę bajtów z pliku.
Parametry dwMaximumSizeHigh i dwMaximumSizeLow parametrów CreateFileMapping umożliwiają określenie liczby bajtów do zamapowania z pliku:
Jeśli nie chcesz zmieniać rozmiaru pliku (na przykład podczas mapowania plików tylko do odczytu), wywołaj CreateFileMapping i określ zero dla obu dwMaximumSizeHigh i dwMaximumSizeLow. Spowoduje to utworzenie obiektu mapowania plików, który jest dokładnie taki sam jak plik. W przeciwnym razie należy obliczyć lub oszacować rozmiar gotowego pliku, ponieważ obiekty mapowania plików są statyczne w rozmiarze; po utworzeniu nie można zwiększyć ani zmniejszyć ich rozmiaru. Próba mapowania pliku o długości zera w ten sposób kończy się niepowodzeniem z kodem błędu ERROR_FILE_INVALID. Programy powinny testować pliki o długości zerowej i odrzucać takie pliki.
Rozmiar obiektu mapowania pliku, który jest wspierany przez nazwany plik, jest ograniczony przez miejsce na dysku. Rozmiar widoku pliku jest ograniczony do największego dostępnego ciągłego bloku nieuwzględnianej pamięci wirtualnej. Jest to co najwyżej 2 GB pomniejszone o pamięć wirtualną zarezerwowaną przez proces.
Rozmiar obiektu mapowania plików, który wybierasz, kontroluje, jak daleko do pliku można "zobaczyć" z mapowaniem pamięci. Jeśli tworzysz obiekt mapowania plików o rozmiarze 500 KB, masz dostęp tylko do pierwszych 500 KB pliku, niezależnie od rozmiaru pliku. Ponieważ nie zużywa żadnych zasobów systemowych, aby utworzyć większy obiekt mapowania plików, utwórz obiekt mapowania plików, który odpowiada rozmiarowi pliku (ustaw oba parametry dwMaximumSizeHigh i dwMaximumSizeLow funkcji CreateFileMapping na zero), nawet jeśli nie oczekujesz wyświetlenia całego pliku. Koszt zasobów systemowych obejmuje tworzenie widoków i uzyskiwanie do nich dostępu.
Możesz wyświetlić część pliku, która nie rozpoczyna się na początku pliku. Aby uzyskać więcej informacji, zobacz Tworzenie widoku w pliku.
Tematy pokrewne