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

  • 相关阅读:
    黄聪:robots.txt一分钟教程
    黄聪:C#获取系统中的所有字体
    黄聪:C#下如何实现服务器+客户端的聊天程序
    黄聪:C#截取DOS命令输出流取得网卡MAC地址
    黄聪:选择适当的关键词
    黄聪:C#的Main(String[] args)参数输入问题
    黄聪:C#正则表达式整理备忘
    黄聪:【强烈推荐】搜索引擎排名决定一切吗!
    黄聪:第2章 并发操作的一致性问题 (2)
    黄聪:VS2008 "LIB 环境变量" 无效解决方案
  • 原文地址:https://www.cnblogs.com/key-ok/p/3380808.html
Copyright © 2011-2022 走看看