zoukankan      html  css  js  c++  java
  • 关于使用MAPVIEWOFFILE大文件的读写(DELPHI版)

    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
    View Code

  • 相关阅读:
    android数据恢复
    UVA 690 Pipeline Scheduling
    2017 国庆湖南 Day4
    2017 国庆湖南 Day5
    2017 国庆湖南 Day6
    2017国庆 清北学堂 北京综合强化班 Day1
    2017 国庆湖南Day2
    bzoj 2962 序列操作
    UVA 818 Cutting Chains
    UVA 211 The Domino Effect
  • 原文地址:https://www.cnblogs.com/key-ok/p/3380808.html
Copyright © 2011-2022 走看看