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);
    }

  • 相关阅读:
    java免费空间!最简单的openshift免费空间上传代码教程!和FTP一样简单!
    医疗大数据解决方案
    十大经典排序算法的JS版
    读取某个目录下的所有图片并显示到pictureBox
    一些植物查询的网站链接
    植物野外识别速查图鉴
    Winform改变Textbox边框颜色
    Microsoft Access数据库操作类(C#)
    自定义GroupBox
    ArrayList用法整理
  • 原文地址:https://www.cnblogs.com/L-Sunny/p/8389234.html
Copyright © 2011-2022 走看看