windows内存映射文件

http://shushanyegui.duapp.com/?p=731

在描述内存映射文件之前 我们先来写一个系统通过I/O来读写磁盘文件的小程序

windows内存映射文件

#include "stdafx.h"
#include <stdlib.h>
#include <windows.h>

char* Read(LPCWSTR file)
{
    HANDLE hFile = CreateFile(
        (LPCWSTR)file,
        GENERIC_READ,
        0,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL
        );
    DWORD filesize = GetFileSize(hFile, NULL);
    int size = filesize + 1;
    char *buff = (char *)malloc(sizeof(char)*size);
    for (int i = 0; i<size; i++)
    {
        buff[i] = 0;
    }
    DWORD readBytes;
    BOOL flag = ReadFile(hFile, buff, size, &readBytes, NULL);
    if (flag == FALSE)
    {
        printf("ReadFile failed/n");
        return "false";
    }
    CloseHandle(hFile);
    return buff;

}

BOOL Write(LPCWSTR file, char *con)
{
    HANDLE hFile = CreateFile(
        (LPCWSTR)file,
        GENERIC_WRITE | GENERIC_READ,
        0,
        NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL
        );
    if (hFile == INVALID_HANDLE_VALUE)
    {
        return false;
    }
    //TCHAR buff[MAX_PATH];
    DWORD wSize;
    char buff[MAX_PATH];
    sprintf_s(buff, "%s", con);
    BOOL flag = WriteFile(hFile, buff, strlen(buff), &wSize, NULL);
    if (!flag){
        return false;
    }
    //缓冲区内容强制刷新至设备
    if (0 == FlushFileBuffers(hFile))
    {
        printf("Flush failed/n");
    }
    CloseHandle(hFile);
    return true;

}
void TcharToChar(const TCHAR * tchar, char * _char)
{
    int iLength;
    //获取字节长度   
    iLength = WideCharToMultiByte(CP_ACP, 0, tchar, -1, NULL, 0, NULL, NULL);
    //将tchar值赋给_char    
    WideCharToMultiByte(CP_ACP, 0, tchar, -1, _char, iLength, NULL, NULL);
}

void CharToTchar(const char * _char, TCHAR * tchar)
{
    int iLength;
    iLength = MultiByteToWideChar(CP_ACP, 0, _char, strlen(_char) + 1, NULL, 0);
    MultiByteToWideChar(CP_ACP, 0, _char, strlen(_char) + 1, tchar, iLength);
}

int main(int argc, char **argv){
    LPCWSTR filename = TEXT("test.txt");
    char *con = "Hey guys!!";
    if (Write(filename, con))
    {
        MessageBox(NULL, TEXT("Write success!!!"), TEXT("OK"), MB_OK);
    }

    char *buff = Read(filename);
    TCHAR str[256];

    CharToTchar(buff, str);

    if (str)
    {
        TCHAR readBuff[MAX_PATH];
        wsprintf(readBuff, TEXT("%s"), str);
        OutputDebugString(readBuff);
        MessageBox(NULL, readBuff, TEXT("OK"), MB_OK);
    }
    else {
        MessageBox(NULL, TEXT("Oops! There happends something!!"), TEXT("ERROR"), MB_OK);
    }
    return 0;
}

View Code

 http://www.cnblogs.com/fangyukuan/archive/2010/09/09/1822216.html

http://baike.so.com/doc/6784090-7000692.html

 

lpMapAddress 对地址进行操作,就相当与操作文件了。
windows内存映射文件

#include "stdafx.h"
#include <stdlib.h>
#include <windows.h>
typedef struct __ListNode
{
    char data[10];
    struct __ListNode *pNext;
}ListNode, *pListNode;

int main(int argc, char **argv)
{
    LPCWSTR file = TEXT("test.txt");
    HANDLE hFile = CreateFile(     //创建或打开文件内核对象
        file,
        GENERIC_WRITE | GENERIC_READ,
        FILE_SHARE_WRITE | FILE_SHARE_READ,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL
        );

    if (hFile == INVALID_HANDLE_VALUE)
    {
        return false;
    }
    /*
    DWORD dwWriteSize;
    pListNode curr; //当前节点指针
    pListNode head; //首节点
    head = NULL;
    char temp2[20] = { 0 };
    for (int i = 0; i<10; i++)
    {
        curr = (pListNode)malloc(sizeof(ListNode));
        sprintf(temp2, "%.1dn", i);
        strcpy(curr->data, temp2);
        curr->pNext = head;
        head = curr;
    }
    pListNode s;
    s = head;
    wchar_t buff[2] = L"";
    while (s)
    {
        DWORD size = MultiByteToWideChar(CP_ACP, 0, s->data, -1, NULL, 0);
        wchar_t *temp1 = (wchar_t *)malloc(size*sizeof(wchar_t));
        memset(temp1, 0, size*sizeof(wchar_t));
        MultiByteToWideChar(CP_ACP, 0, s->data, -1, temp1, size);
        WriteFile(hFile, temp1, sizeof(temp1), &dwWriteSize, NULL);
        s = s->pNext;
    }
    /**/
    DWORD filesize = GetFileSize(hFile, NULL);
    //创建一个文件映射内核对象
    HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, filesize, NULL);
    if (hMap == INVALID_HANDLE_VALUE)
    {
        return false;
    }
    //将文件数据映射到进程的地址空间
    LPSTR lpMapAddress = (LPSTR)MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, filesize);
    if (lpMapAddress == NULL)
    {
        printf("MapView error!n");
        return -1;
    }
    else
    {
        int m = 0;
        printf("----%dn", filesize);
        while (true)
        {
            if (m > filesize)
            {
                break;
            }
            if (lpMapAddress[m])
            {
                printf("%cn", lpMapAddress[m]);
                lpMapAddress[m] = 97;//可以更改文件的值
            }
            m++;

        }
    }

    UnmapViewOfFile(lpMapAddress);
    CloseHandle(hMap);
    CloseHandle(hFile);
    return 0;
}

View Code

 

下面是linux的版本

windows内存映射文件

#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
int main(){
        int  File;
        struct stat sb;
        unsigned char *startAddr;

        File = open("./OPWIN.bin",O_RDONLY);
        //File = open("./test.txt",O_RDONLY);
        fstat(File,&sb);

        printf("--------%dn",sb.st_size);
        startAddr=(unsigned char *)mmap(NULL,sb.st_size,
            PROT_READ,MAP_PRIVATE,File,0);

        //printf("%s",startAddr);
        munmap(startAddr,sb.st_size);
        close(File);


}

View Code

 

原文链接: https://www.cnblogs.com/yuguangyuan/p/5955980.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    windows内存映射文件

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/398015

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月11日 上午9:51
下一篇 2023年4月11日 上午9:52

相关推荐