delphi读取文件夹内容 (delphi存储过程)

一、内存映射文件的概述

内存映射文件:就是将磁盘上的文件全部或者部分映射到物理内存的一块地址空间,通过这个地址空间,应用程序就可以象访问内存一样来访问这个磁盘文件。

通常情况下,文件的操作要通过打开,读取,处理,关闭这样的步骤,要使用AssignFile,Rewriter,Reset,Write,Read等等这些函数,过程比较繁琐。并且需要自己来处理文件的缓存,这也是一个相当麻烦的过程。

通过把磁盘文件映射到虚拟内存地址空间,并得到指向该区域的指针,通过这个指针对文件进行操作。这样,在避免使用I/O操作来处理文件的同时,由操作系统来处理文件的缓存,缓冲,写入,调入,内存的分配和释放,极大的简化了对文件的访问,提高了效率,尤其是频繁对大文件处理时的更是如此。

因此,对于内存映射文件的使用,主要是有两大好处,一是简化操作,二是提高效率。

二、内存映射文件在软件开发中的应用。

1、用来调入和运行EXE和DLL文件,节省页交换的空间,加快程序运行的速度。

2、以指针的形式对映射文件的数据进行处理,简化操作,提高效率。

3、在同一台计算机上,利用内存映射文件实现多个进程共享数据

1主要是用于系统软件的开发,2和3在应用级软件开发方面用的比较多。

三、内存映射文件的使用

1、用FileCreate创建文件,或者用FileOpen打开文件,取得这个文件的句柄。

具体到FileOpen,文件的访问模式分为:fmOpenRead,fmOpenWrite,fmOpenReadWrite,也可以是0,0代表既不能读,也不能写。如果要在不同程序间共享数据,则要把文件的访问模式和共享模式结合起来。

文件的共享模式分为:

fmShareCompat,这个模式已经过时,

fmShareExclusive 不允许共享

fmShareDenyWrite 不允许别人以fmOpenWrite模式打开

fmShareDenyRead 不允许别人以fmOpenRead模式打开

fmShareDenyNone 允许别人以任何模式打开,Deny是禁止的意思。

2、用CreateFileMapping创建文件映射对象,该函数具有6个参数

第一个是THandle类型的,将要映射的文件的句柄,从FileCreate或者FileOpen得来。

第二个是指向TSeucrityAttributes结构指针的内存映射对象的安全属性,通常设为nil

第三个是文件视图的保护类型,分为以下3种保护类型

PAGE_READONLY 对应的文件以fmOpenRead模式打开

PAGE_READWRITE 对应的文件以fmOpenReadWrite模式打开

PAGE_WRITECOPY 对应的文件以fmOpenWrite或fmOpenReadWrite模式打开,这种类型下,会复制修改过后的内存页面。

第四个是文件映射对象最大尺寸的高32位值,如果文件小于4G,该值为0

第五个是文件映射对象最大尺寸的低32位值,该值为0的话,表示映射对象最大尺寸等于文件大小

第六个是文件映射对象的名称

该函数调用成功,返回文件映射对象的句柄,失败则返回0,这个函数的作用,本质上说,就是告诉操作系统,要映射哪个文件,文件的大小是多少。

除此之外,也可以用OpenFileMapping函数来打开一个文件映射对象。

3、用MapViewOfFile把文件视图映射到进程的地址空间,该函数具有5个参数

第一个是文件映射对象的句柄

第二个是文件视图访问模式,分为四种模式

FILE_MAP_WRITE 对应PAGE_READ_WRITE

FILE_MAP_READ 无限制

FILE_MAP_ALL_ACCESS 对应PAGE_READ_WRITE

FILE_MAP_COPY 允许文件写入的同时进行复制,无限制

第三个是文件映射起始位置偏移量的高32位

第四个是文件映射起始位置偏移量的低32位

第五个是要映射的字节数,0表示映射全部文件

该函数调用成功,返回文件视图的起始地址。调用失败则返回nil。这个函数,从本质上说,就是告诉操作系统,把文件映射到哪里,映射多少个字节。

4、用UnmapViewOfFile解除文件视图与进程地址空间的映射关系

完成文件处理后,应当马上UnmapViewOfFile,释放映射区域内存。这个函数只需要一个参数,就是就是MapViewOfFile函数的返回值

5、用CloseHandle关闭文件句柄和文件映射对象句柄,调用成功返回True,失败返回False。