zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    一个基于Angular+Ionic+Phonegap的混合APP实战
    Kafka
    kafka
    Kafka
    归并排序
    插入排序
    CC1310的晶振问题
    CC1310的RSSI值问题
    CC1310之使用SMARTRF STUDIO
    CC1310电源
  • 原文地址:https://www.cnblogs.com/yzryc/p/6404972.html
Copyright © 2011-2022 走看看