delphi 大文件的读写 使用 MapviewOffile

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