windows API文件映射实现

lhy19850424 2011-03-31 12:42:12
/* 头文件 */
#include <windows.h>
#include <stdio.h>
/* 预处理申明 */
#define BUFFSIZE 1024 // 内存大小
#define FILE_MAP_START 0x28804 // 文件映射的起始的位置
/* 全局变量 */
LPTSTR lpcTheFile = TEXT("C:\\test.dat"); // 文件名



int CMaxFILEDlg::WindowsApi()
{
HANDLE hMapFile; // 文件内存映射区域的句柄
HANDLE hFile; // 文件的句柄
DWORD dBytesWritten; // 写入的字节数
DWORD dwFileSize; // 文件大小
DWORD dwFileMapSize; // 文件映射的大小
DWORD dwMapViewSize; // 视图(View)的大小
DWORD dwFileMapStart; // 文件映射视图的起始位置
DWORD dwSysGran; // 系统内存分配的粒度
SYSTEM_INFO SysInfo; // 系统信息
LPVOID lpMapAddress; // 内在映射区域的起始位置
PCHAR pData; // 数据
INT i; // 循环变量
INT iData;
INT iViewDelta;
BYTE cMapBuffer[32]; // 存储从mapping中计出的数据

// 创建一个文件
hFile = CreateFile(lpcTheFile,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
//判断文件是否创建成功
if (hFile == INVALID_HANDLE_VALUE)
{
printf("CreateFile error\n",GetLastError);
return 1;
}
// 依次写入整数,一共写入65535个整数
// 在32位平台下,大小为65535*32
for (i=0; i<65535; i++)
{
WriteFile (hFile, &i, sizeof (i), &dBytesWritten, NULL);
}
// 查看写入完成后的文件大小
dwFileSize = GetFileSize(hFile, NULL); //262140 25600
printf("文件大小: %d\n", dwFileSize);

//获取系统信息,内存分配粒度
//获取分配粒度,进行下面的几个计算,
//目的是为了映射的数据与系统内存分配粒度对齐,提高内存访问效率
GetSystemInfo(&SysInfo);
dwSysGran = SysInfo.dwAllocationGranularity;

//计算mapping的起始位置
dwFileMapStart = (FILE_MAP_START / dwSysGran) * dwSysGran;
// 计算mapping view的大小
dwMapViewSize = (FILE_MAP_START % dwSysGran) + BUFFSIZE;
// 计算mapping的大小
dwFileMapSize = FILE_MAP_START + BUFFSIZE;
// 计算需要读取的数据的偏移
iViewDelta = FILE_MAP_START - dwFileMapStart;

// 创建File mapping
hMapFile = CreateFileMapping( hFile, // 需要映射的文件的句柄
NULL, // 安全选项:默认
PAGE_READWRITE, // 可读,可写
0, // mapping对象的大小,高位
dwFileMapSize, // mapping对象的大小,低位
NULL); // mapping对象的名字
if (hMapFile == NULL)
{
printf("CreateFileMapping error: %d\n", GetLastError() );
return 1;
}

// 映射view
lpMapAddress = MapViewOfFile(hMapFile, // mapping对象的句柄
FILE_MAP_ALL_ACCESS, // 可读,可写
0, // 映射的文件偏移,高32位
dwFileMapStart, // 映射的文件偏移,低32位
dwMapViewSize); // 映射到View的数据大小
if (lpMapAddress == NULL)
{
printf("MapViewOfFile error: %d\n", GetLastError());
return 1;
}

printf ("文件map view相对于文件的起始位置: 0x%x\n",
dwFileMapStart);
printf ("文件map view的大小:0x%x\n", dwMapViewSize);
printf ("文件mapping对象的大小:0x%x\n", dwFileMapSize);
printf ("从相对于map view 0x%x 字节的位置读取数据,", iViewDelta);

// 将指向数据的指针偏移,到达我们关心的地方
pData = (PCHAR) lpMapAddress + iViewDelta;
// 读取数据,赋值给变量
iData = *(PINT)pData;
// 显示读取的数据
printf ("为:0x%.8x\n", iData);

// 从mapping中复制数据,32个字节,并打印
CopyMemory(cMapBuffer,lpMapAddress,32);
printf("lpMapAddress起始的32字节是:");
for(i=0; i<32; i++)
{
printf("0x%.2x ",cMapBuffer[i]);
}
// 将mapping的前32个字节用0xff填充
FillMemory(lpMapAddress,32,(BYTE)0xff);
// 将映射的数据写回到硬盘上
FlushViewOfFile(lpMapAddress,dwMapViewSize);
printf("\n已经将lpMapAddress开始的32字节使用0xff填充。\n");

// 关闭mapping对象
if(!CloseHandle(hMapFile))
{
printf("\nclosing the mapping object error %d!",
GetLastError());
}
//关闭文件
if(!CloseHandle(hFile))
{
printf("\nError %ld occurred closing the file!",
GetLastError());
}

return 0;

}

...全文
160 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2011-03-31
  • 打赏
  • 举报
回复
内存映射修改大文件

http://www.vckbase.com/document/viewdoc/?id=1831
jixingzhong 2011-03-31
  • 打赏
  • 举报
回复
内存映射文件使用详细
http://blog.vckbase.com/ddlddy/archive/2010/01/29/40886.html
jixingzhong 2011-03-31
  • 打赏
  • 举报
回复
你的问题是什么的?
bEst_02 2011-03-31
  • 打赏
  • 举报
回复
LZ想问什么?
作为Microsoft 32位平台的应用程序编程接口, Win32 API是从事Windows应用程序开发所必备的。 首先对Win32 API函数做完整的概述;然后收录五大类函数: 窗口管理、图形设备接口、系统服务、国际特性以及网络服务; 在附录部分,讲解如何在Visual Basic和Delphi中对其调用。 本书是从事Windows应用程序开发的软件工程师的必备参考手册。 控件与消息函数 共91个函数 硬件与系统函数 共98个函数 设备场景函数 共73个函数 绘图函数 共105个函数 位图、图标和光栅运算函数 共39个函数 菜单函数 共37个函数 文本和字体函数 共41个函数 打印函数 共66个函数 文件处理函数 共118个函数 进程和线程函数 共40个函数 Windows消息函数 共11个函数 网络函数 共14个函数 目 录 第一章 Win32 API概论…………………………………………………………………………1 1.1 为什么使用Win32 API …………………………………………………………………1 1.2 Win32 API简介 …………………………………………………………………………1 1.3 综述………………………………………………………………………………………11 第二章 窗口管理函数(Windows Control Function) ……………………………………13 2.1 易用特性函数(Accessibility Features)…………………………………………13 2.2 按钮函数(Button)……………………………………………………………………20 2.3 插入标记(^)函数(Caret)…………………………………………………………21 2.4 组合框函数(Combo box) ……………………………………………………………24 2.5 通用对话框函数(Common Dialog Box) ……………………………………………25 2.6 标函数(Cursor)………………………………………………………………………36 2.7 对话框函数(Dialog Box)……………………………………………………………40 2.8 编辑控制函数(Edit Control)………………………………………………………54 2.9 图标函数(Icon)………………………………………………………………………54 2.10 键盘加速器函数(Keyboard Accelerator)……………………………………… 61 2.11 键盘输入函数(Keyboard InPut) …………………………………………………63 2.12 列表框函数(List box) ……………………………………………………………75 2.13 菜单函数(Menu) ……………………………………………………………………76 2.14 消息和消息队列函数(Message and Message Queue)……………………………90 2.15 鼠标输入函数(Mouse Input) ……………………………………………………100 2.16 多文档接口函数(Multiple Document Interface) ……………………………103 2.17 资源函数(Resource)………………………………………………………………105 2.18 滚动条函数(Scroll Bar)…………………………………………………………113 2.19 窗口函数(Window)…………………………………………………………………119 2.20 窗口类函数(Window Class)………………………………………………………144 2.21 窗口过程函数(Window Procedure)………………………………………………150 2.22 窗口属性函数(Window Property) ………………………………………………152 第三章 图形设备接口函数(Graphic Device Interface Function) …………………155 3.1 位图函数(Bitmap) …………………………………………………………………155 3.2 笔刷函数(Brush)……………………………………………………………………171 3.3 剪切函数(Clipping) ………………………………………………………………176 3.4 颜色函数(Color)……………………………………………………………………179 3.5 坐标空间与变换函数(Coordinate Space Transformation)……………………186 3.6 设备环境函数(Device Context) …………………………………………………195 3.7 填充形态函数(Filled shape) ……………………………………………………211 3.8 字体和正文函数(Font and Text)…………………………………………………215 3.9 ICM 2.0函数 …………………………………………………………………………238 3.10 线段和曲线函数(Line and Curve)………………………………………………295 3.11 图元文件函数(Metafile)…………………………………………………………300 3.12 多显示器函数(Multiple Display Monitors) …………………………………311 3.13 绘图函数和画图函数(Painting and Drawing)…………………………………313 3.14 路径函数(Path)……………………………………………………………………328 3.15 画笔函数(Pen) ……………………………………………………………………332 3.16 打印及打印假脱机程序函数(Printing and Print Spooler)…………………334 3.17 矩形函数(Rectangle) ……………………………………………………………371 3.18 区域函数(Region)…………………………………………………………………374 第四章 系统服务函数(System Service Function) ……………………………………383 4.1 访问控制函数(Access Control) …………………………………………………383 4.2 原子函数(Atom) ……………………………………………………………………406 4.3 客户/服务器访问控制函数(Client/Server Access Control) ………………409 4.4 剪贴板函数(Clipboard)……………………………………………………………431 4.5 通信函数(Communication)…………………………………………………………436 4.6 控制台函数(Console)………………………………………………………………444 4.7 数据解压库函数(Data Decompression Library) ………………………………463 4.8 调试函数(Debugging)………………………………………………………………466 4.9 设备输入输出函数(Device Input and Output)…………………………………472 4.10 动态数据交换函数(Dynamic Data Exchange) …………………………………474 4.11 动态数据交换管理函数(Dynamic Data Exchange Management)………………476 4.12 动态链接库函数(Dynamic-Link Library)………………………………………489 4.13 错误函数(Error) …………………………………………………………………496 4.14 事件日志函数(Event Logging) …………………………………………………499 4.15 文件函数(File)……………………………………………………………………503 4.16 文件安装库函数(File Installation Library) ………………………………542 4.17 文件映射函数(File Mapping)……………………………………………………546 4.18 文件系统函数 File System)………………………………………………………551 4.19 句柄和对象函数(Handle and Object)………………………………………………556 4.20 挂钩函数(Hook)………………………………………………………………………560 4.21 ImageHlp函数…………………………………………………………………………572 4.22 大整数操作函数(Iarge Integer Operations)……………………………………594 4.23 低层访问控制函数(Low-Level Access Control)………………………………596 4.24 LSAPI函数 …………………………………………………………………………617 4.25 邮槽函数(Mailslot)………………………………………………………………622 4.26 内存管理函数(Memory Management) ……………………………………………623 4.27 管道函数(Pipe) …………………………………………………………………655 4.28 电源管理函数(Power Management) …………………………………………… 663 4.29 进程和线程函数(Process and Thread)…………………………………………666 4.30 注册表函数(Registry)……………………………………………………………700 4.31 字符串操作函数(String Manipulation)……………………………………… 724 4.32 结构化异常处理函数(Structured Exception Handling) ……………………742 4.33 同步函数(Synchronization) ……………………………………………………745 4.34 系统信息函数(System Information)……………………………………………766 4.35 系统消息函数(System Message)…………………………………………………780 4.36 系统关机函数(System Shutdown) ………………………………………………781 4.37 磁带备份函数(Tape Backup) ……………………………………………………783 4.38 时间函数(Time)……………………………………………………………………789 4.39 计时器函数(Timer) ………………………………………………………………795 4.40 工具帮助函数(Tool Help) ………………………………………………………796 4.41 窗口站和桌面函数(Window Station and Desktop)……………………………799 4.42 Windows NT 4.0访问控制函数(Window NT 4.0 Access-Control)……………808 4.43 WinTrust函数(WinTrust)…………………………………………………………814 第五章 国际特性函数(International Peatures Punction)时性…………………………815 5.1 输入方法编辑函数(Input Method Editor)…………………………………………815 5.2 国家语言支持函数(National Language Support)………………………………… 828 5.3 Unicode和字符集函数(Unicode and Character Set)……………………………… 843 第六章 网络服务函数(Networding Service Function)……………………………………849 6.1 数据链路控制函数(DLC)………………………………………………………………849 6.2 网络函数(Net)…………………………………………………………………………849 6.3 NetBIOS函数……………………………………………………………………………896 6.4 网络DDE函数(Networking DDE)……………………………………………………897 6.5 RAS服务器管理函数(RAS Server Administration)………………………………901 6.6 远程访问服务函数(Remote Access Administration)………………………………910 6.7 服务函数(Service)……………………………………………………………………929 6.8 Windows网络函数(Windows Networking)……………………………………………930 附录1 如何在VB中调用DLL API ……………………………………………………………945 1 DLL API的声明……………………………………………………………………………945 2 DLL API的调用……………………………………………………………………………947 附录2 在Delphi中直接调用Windows API…………………………………………………953
Re:  FastDFS 分布式文件系统部署 ============================== FastDFS 分布式存储主要功能有:文件存储,文件同步,文件访问(文件上传/下载),特别适合以文件为载体的在线服务,如图片网站,视频网站等 它的存储特点是对文件体积小或超小,同时文件的数量特别多的存储情况支持较好,(如果是大文件的存储就推荐使用 Glusterfs 分布式网络文件存储),所谓的小文件就是指网站的图片,文档或者小视频等等,体积范围在4K~500MB之间。所谓的大文件指软件的镜像包、电影等等。 除了FastDFS存储文件特点之外,它同时具备自我负载均衡的能力,可以解决了运维自动化的关键问题。 # 块存储、文件存储、对象存储这三者的本质差别是什么? 1)块存储:磁盘阵列,硬盘(块存储主要是将裸磁盘空间整个映射给主机使用的) 2)文件存储:FTP、NFS服务器(解决文件无法共享的问题) 3)对象存储:内置大容量硬盘的分布式服务器(解决容量、性能、可靠性等问题) 多台服务器内置大容量硬盘,再装上对象存储软件, 然后再额外搞几台服务作为管理节点,安装上对象存储管理软件。 # gluterfs主要运行场景: 存储大文件,针对小文件或超小文件的支持比较差 KVM镜像 视频文件 # FastDFS主要运行场景: 存放文件size范围:4K~500MB # 对象存储 - GlusterFS、Ceph、FastDFS(非对象存储) 必备技能:DRBD/NFS/MooseFS/ GlusterFS/ FastDFS/TFS(http://tfs.taobao.org/)/ # 访问客户端:只能专用API访问实现 存放单元文件size范围:4K~500MB(阅读、声音、视频网站) # 典型用户:      ... ... 

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧