zoukankan      html  css  js  c++  java
  • windows核心编程第17章 一个文件 0个缓存

    看windows核心编程17章复习内存映射方面的知识,看到了一系列的一个文件0个缓存,一个文件一个缓存等的简单说明,自己按照

    自己的本意写了个计数和记录他们之间读写或者映射数据的时间差别的工程。

    // 内存映射处理大文件.cpp : 定义控制台应用程序的入口点。

    #include <windows.h>
    #include <stdio.h>
    #include <iostream>
    #include <string>
    #include<winnt.h>

    using namespace std;

    string GetValue( TCHAR *, const TCHAR *); //根据name得value
    void main(int argc, char* argv[])
    {
    // 创建文件对象(C: est.tsr)
    HANDLE hFile = CreateFile("E:/862.exe", GENERIC_READ | GENERIC_WRITE,
    0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
    printf("创建文件对象失败,错误代码:%d ", GetLastError());
    return;
    }
    // 创建文件映射对象
    HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
    if (hFileMap == NULL)
    {
    printf("创建文件映射对象失败,错误代码:%d ", GetLastError());
    return;
    }

    // 得到系统分配粒度
    SYSTEM_INFO SysInfo;
    GetSystemInfo(&SysInfo);
    DWORD AlignGrainSize = SysInfo.dwAllocationGranularity;//可以分配虚拟内存的起始地址的粒度。
    // 得到文件尺寸
    DWORD dwFileSizeHigh;
    __int64 FileSize = GetFileSize(hFile, &dwFileSizeHigh);//返回到低字节 高字节为空则大文件会出错,也不一定
    FileSize |= (((__int64)dwFileSizeHigh) << 32);//或还是自己
    // 关闭文件对象
    CloseHandle(hFile);
    // 偏移地址
    __int64 qwFileOffset = 0;
    // 块大小
    DWORD dwBlockBytes = 0;
    dwBlockBytes = (DWORD)FileSize;
    if (qwFileOffset >= 0)
    {
    // 映射视图
    DWORD start, end;
    start = GetTickCount();

    TCHAR *lpbMapAddress = (TCHAR *)MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS,
    0, 0,
    dwBlockBytes);
    if (lpbMapAddress == NULL)
    {
    printf("映射文件映射失败:%d ", GetLastError());
    return;
    }
    int j = 0;
    for (DWORD i = 0; i < dwBlockBytes; i++)
    {
    //if (lpbMapAddress[i] == 0)
    //{
    j++;
    //}
    /*char*v1 = strstr(lpbMapAddress, "NIHAO");
    //if (v1 != NULL)
    {
    printf("%5s ", v1);
    goto Exit;

    }*/
    }
    printf("%d", j);
    // 撤销文件映像
    UnmapViewOfFile(lpbMapAddress);
    end = GetTickCount();
    printf("time=%d ", end - start);

    }
    // 关闭文件映射对象句柄
    CloseHandle(hFileMap);
    getchar();
    Sleep(6000);
    }

  • 相关阅读:
    谈谈 rm -rf * 后的几点体会(年轻人得讲码德)
    shell读取文档中的命令并逐行执行
    被踢出工作群聊后的若干反思
    units命令单位转换
    想买保时捷的运维李先生学Java性能之 垃圾收集器
    想买保时捷的运维李先生学Java性能之 垃圾收集算法
    想买保时捷的运维李先生学Java性能之 生存与毁灭
    想买保时捷的运维李先生 求救求救求救求救
    想买保时捷的运维李先生学Java性能之 运行时数据区域
    想买保时捷的运维李先生学Java性能之 JIT即时编译器
  • 原文地址:https://www.cnblogs.com/L-Sunny/p/8389234.html
Copyright © 2011-2022 走看看