delphi 大文件的读写 使用 MapviewOffile

摘要:
');//------------------- 3.使用CreateFileMapping创建刚使用FileOpen--//tryFFileSize:=GetFileSize创建的HANDLE文件映射对象;FMapHandle:=CreateFileMapping;如果FMapHandle=0,则引发异常。创建('创建内存映射文件失败!
unit filemap;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
const
    fileName = 'myTest.txt';
type
  TForm1 = class(TForm)
    btnUpper: TButton;
    btnLower: TButton;
    txtContent: TMemo;
    Label1: TLabel;
    btnClose: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btnUpperClick(Sender: TObject);
    procedure btnLowerClick(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
  private
    { Private declarations }
  public
    UCase:Boolean;
    procedure ChangeFileCase;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// 全文中的txtContent.Lines.LoadFromFile(fileName)其目的只是为了显示文件修改结果

procedure TForm1.FormCreate(Sender: TObject);
begin
    txtContent.Clear();
    txtContent.Lines.LoadFromFile(fileName);
    //缺省将其转变为大写
    UCase := True;
end;

procedure TForm1.btnUpperClick(Sender: TObject);
begin
    UCase := true;
    ChangeFileCase;
end;

procedure TForm1.btnLowerClick(Sender: TObject);
begin
    UCase := false;
    ChangeFileCase;
end;

procedure Tform1.ChangeFileCase;//这个是本示例文件的核心运算部分
var
    FFileHandle : THandle;
    FMapHandle : THandle;
    FFileSize : Integer;
    FData : PByte;
    PData : PChar;
begin
//-------------------1 判断文件是否存在----------------------//
    if not FileExists(fileName) then
        raise Exception.Create('文件不存在!')
    else
//-------------------2 使用FileOpen获取一个文件HANDLE--------//
        FFileHandle := FileOPen(fileName,fmOPenReadWrite);
    //如果创建文件失败,就抛出一个异常
    if FFileHandle = INVALID_HANDLE_VALUE then
        raise Exception.Create('打开或创建文件失败!');
//-------------------3 使用CreateFileMapping创建一个刚才用FileOpen创建的HANDLE的文件映射对象--

-//
    try
        FFileSize := GetFileSize(FFileHandle,nil);
        FMapHandle := CreateFileMapping(FFileHandle,nil,PAGE_READWRITE,0,FFileSize,nil);

        if FMapHandle = 0 then
            raise Exception.Create('创建内存映射文件失败!');
    finally
        CloseHandle(FFileHandle);
    end;
//-------------------4 使用MapViewOfFile创建一个CreateFileMapping建立的HANDLE的映射文件的视图到

进程的地址空间------//
    try
        FData := MapViewOfFile(FMapHandle,FILE_MAP_ALL_ACCESS,0,0,FFileSize);
        if FData = nil then
            raise Exception.Create('映射文件失败!');
    finally
        CloseHandle(FMapHandle);
    end;
//-------------------5 对MapViewOfFile返回的指针做相应的运算操作------//
    try
        PData := PChar(FData);
        inc(PData,FFileSize);
        PData^ := #0;

        if UCase then
            StrUpper(PChar(FData))
        else
            StrLower(PChar(FData));
    finally
//-------------------6 取消文件视图的映射------//
        UnmapViewOfFile(FData);
    end;
    txtContent.Lines.Clear();
    txtContent.Lines.LoadFromFile(fileName);
end;

procedure TForm1.btnCloseClick(Sender: TObject);
begin
    Form1.Close();
end;

end.

{
//-------------------------------------------------------//
在做指针具体运算时,可以采用这样直接获取该指针处的某一类型的值
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
     p: Pointer;
begin
   i := 12345678;
   p := @i;
   showmessage(inttostr(integer(p)));   //俺的电脑上1242664,这是一个地址
   showmessage(inttostr(Pinteger(p)^));   //12345678
   showmessage(inttostr(PWord(p)^)); //24910
end;

Pinteger(p)^表示指针P处取得一个Integer值
PWord(p)^表示指针P处取得一个Word值

在windows.pas和system.pas中还定义了很多指针类型如下 PInteger = ^Integer; {$NODEFINE PInteger
} { defined in sysmac.h } PCardinal = ^Cardinal; PWord = ^Word; PSmallInt = ^SmallInt; {$NODEFINE PSmallInt} { defined in sysmac.h } {$POINTERMATH ON} PByte = ^Byte; {$NODEFINE PByte} { defined in sysmac.h } {$POINTERMATH OFF} PShortInt = ^ShortInt; {$NODEFINE PShortInt} { defined in sysmac.h } PInt64 = ^Int64; {$NODEFINE PInt64} { defined in sysmac.h } PUInt64 = ^UInt64; PLongWord = ^LongWord; {$NODEFINE PLongWord} { defined in sysmac.h } PSingle = ^Single; {$NODEFINE PSingle} { defined in sysmac.h } PDouble = ^Double; {$NODEFINE PDouble} { defined in sysmac.h } PDate = ^Doub

免责声明:文章转载自《delphi 大文件的读写 使用 MapviewOffile》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇正则表达式过滤联系方式,微信手机号QQ等egret 入门学习笔记之问题解决下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Delphi线程的终止

当线程对象的Execute()执行完毕,我们就认为此线程终止了。这时候,它会调用Delphi的一个标准例程EndThread(),这个例程再调用API函数ExitThread()。由ExitThread()来清除线程所占用的栈。 当结束使用TThread对象时,应该确保已经把这个Delphi对象从内存中清除了。这才能确保所有内存占有都释放掉。尽管在进程终止...

安装UniDAC控件包

UniDAC是一个功能强大的非可视化跨数据库的数据访问组件,可用于Delphi,Delphi for .NET,C++Builder,and Lazarus (Free Pascal)。它提供了对流行数据库服务器的统一访问,像Oracle,Microsoft SQL Server,MySQL,InterBase,Firebird,PostgreSQL,SQ...

《Delphi 算法与数据结构》学习与感悟[10]: 双向链表

如果在结构中再拿出 4 个字节的地址空间指向上一个节点, 就成了双向链表了. 本例效果图: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type...

Delphi调用IE打开网页

//调用相应程序打开   uses ShellAPI;   procedure TForm1.Button1Click(Sender: TObject);   begin   //用IE打开   ShellExecute(Handle, 'open', 'IExplore.EXE', 'about:blank', nil, SW_SHOWNORMAL);...

delphi的构造函数和析构函数

delphi的构造函数的定义是:constructor create;delphi的析构函数的定义是:destructor destroy;析构函数是不能重载的,但是构造函数是可以重载的。构造函数在重载的时候要在后面加“overload”,例如:constructor create;overload;constructor create(i:integer...

Delphi 匿名函数的几个实际应用(一)  转

转 busintel 专栏包含如下的六个部分:   Anonymous Event Handlers 匿名事件处理器 Timing Anonymous Methods 计时功能匿名方法 Thread Synchronization with the VCL   VCL线程同步 Parallel For Loop 并行循环 AJAX in Delphi De...