TMapTextfile v.99/1
Class to handle text files as memory mapped files.
Including efficient methodes for access like sequentiell read
or random access read to text, high performance search routines
and many more.
{
==============================================================================
MapTextfiles - Release 99/1 14.03.1999
for Delphi 4, should also run with Delphi 3 ------------------------------------------------------------------------------ MapTextfiles is FREEWARE. Freeware means, that you can use this software
without paying anything for it, but it is not public domain! This software
is protected through the law of the Federal Republic of Germany, the European
Union and other countries. (C)1999 by Peter Hellinger Software, All rights are reserved. Peter Hellinger Software, Zerzabelshofstrasse 41, D-90480 N黵nberg email: mail@helli.de
homepage: http://www.helli.de ============================================================================== Installation:
Copy MAPTEXTFILE.PAS into your library path. Use ist. 8-) ------------------------------------------------------------------------------ In Delphi you have many ways to manipulate text files. But all of these have
a handicap: You must read the whole file (StringList) or you can only access
data sequential (Assign/Readln). The Windows API provides the so called Memory Mapped Files. Windows self
uses MMFs to load EXE or DLL. Therefore the mechanism is very efficient, but
simple to handle. The only handicap is, that you must know the size of the
file before you access it. This means for typical text files, that the
operation is normally limited to read from the file or manipulate inside. The class TMapTextfile wraps the neccesary API calls and povides efficent
functions for accessing the data. TMapTextfiles provides the following properties and methods: Methodes:
========= Create Creates an instace of the class Destroy Destroys the instance Open Opens a file as a memory mapped file. filename = name of the file
mode = open mode:
mmRead = Open only for read
mmReadWrite = Open for read and wrie Returns INVALID_HANDLE_VALUE if the file not exist.
If the result > 0 all is OK. NOTE:
1. The file must exist!
2. You cannot write behind the end of the file. Close Close the memory mapped file and frees all handles. EndOfFile Returns TRUE, if the End of the file is reached. GetSize Returns the Size of the file in Bytes GetPos Returns the actual file read/write position
NOTE: Position 0 is the start of the file SetPos Sets the actual read/write position
NOTE: Position 0 is the start of the file ReadChar Reads a character from the actual read/write position.
The r/w position is incremented. ReadString Returns a string, starting at the actual r/w position.
The string is delimited by characters < SPACE, but not
by ESC (#27) and TAB. The r/w position moves to the
end of the string, delimiter chararcters are skiped. ReadLn Same as ReadSring, but as a Procedure. ReadCharAt Reads a charater from an arbitray possition.
The r/w position is NOT moved! pos = position to read from (0 = start of the file!) ReadChars Reads a line of charactes from the MMF.
The r/w position is NOT moved! str = The buffer to read to
pos = position to read from (0 = Start of the file!)
len = number of characters to read. ReadStringAt Returns a string, starting at an arbitray possition.
The string is delimited by characters < SPACE, but not
by ESC (#27) and TAB. The r/w position is NOT moved. FindString Findes a substring in the MMF and Returns the position. str = rhe substring to search for
pos = position to start the search (0 = start of the file)
max = position to end the search. If this is 0 or less
then 0 the end of the file is the limit. Returns the position of the substring or -1 if the
substring is not found. FindWildCard Same as Findstring, but supports wildcard search. str = the substring to search for
pos = position to start the search (0 = start of the file)
max = position to end the search. If this is 0 or less
then 0 the end of the file is the limit.
wild = the character used as wildcard (i.e. "*")
joker = the character used as joker (i.e. "?") Returns the position of the substring or -1 if the
substring is not found. ReadBytes Reads a number of bytes to a anonymous variable.
The r/w position is NOT moved! b = the anonymous variable
pos = position to read from (0 = start of the file)
len = number of bytes to read. WriteBytes Writes a number of bytes to the file.
NOTE: You can not write behind the end of the file!!! b = the anonymous variable
pos = position to write to (0 = start of the file)
len = number of bytes to write ==============================================================================
} unit uMapTextfile; interface uses Classes, Windows; type
tMapMode = ( mmRead, mmReadWrite ); type
TMapTextfile = class
private
f_file : THandle;
f_MMF : THandle;
f_size : INTEGER;
f_view : PByte;
f_data : PChar;
f_pos : INTEGER;
f_open : BOOLEAN;
function CalcPos( pos : INTEGER ) : PChar;
public
constructor Create;
destructor Destroy; override;
function Open( const filename : string; mode : tMapMode ) : INTEGER;
procedure Close;
function ReadChar : CHAR;
function ReadString : string;
procedure ReadLn( var str : string );
function ReadCharAt( pos : LONGINT ) : CHAR;
procedure ReadChars( str : PChar; pos, len : LONGINT );
function ReadStringAt( pos : LONGINT ) : string;
function GetSize : LONGINT;
function GetPos : LONGINT;
procedure SetPos( pos : LONGINT );
function EndOfFile : BOOLEAN;
function FindString( const str : string; pos, max : INTEGER ) : INTEGER;
function FindWildCard( const str : string; pos, max : INTEGER;
wild, joker : CHAR ) : INTEGER;
procedure ReadBytes( var b; pos, len : LONGINT );
procedure WriteBytes( var b; pos, len : LONGINT );
end; implementation constructor TMapTextfile.Create;
begin
f_open := FALSE;
end; function TMapTextfile.Open( const filename : string; mode : tMapMode )
: INTEGER;
var
m1, m2, m3 : CARDINAL;
begin
f_open := FALSE;
if mode = mmRead then
begin
m1 := GENERIC_READ;
m2 := PAGE_READONLY;
m3 := FILE_MAP_READ;
end else begin
m1 := GENERIC_READ + GENERIC_WRITE;
m2 := PAGE_READWRITE;
m3 := FILE_MAP_WRITE;
end; f_file := CreateFile( PChar( filename ), m1, FILE_SHARE_READ, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, ); if f_file = INVALID_HANDLE_VALUE then
begin
Result := INVALID_HANDLE_VALUE;
EXIT;
end;
try f_size := GetFileSize( f_file, nil ); f_MMF := CreateFileMapping( f_file, nil, m2, , f_size, nil ); if f_MMF = then
begin
Result := -;
EXIT;
end;
finally CloseHandle( f_file );
end; try
f_view := MapViewOfFile( f_MMF, m3, , , f_size );
if f_view = nil then
begin
Result := -;
EXIT;
end;
finally
CloseHandle( f_MMF );
end;
f_data := PChar( f_view );
f_pos := ;
f_open := TRUE;
Result := ;
end; destructor TMapTextfile.Destroy;
begin
if f_open then
Close;
inherited;
end; procedure TMapTextfile.Close;
begin
if f_open then
begin
UnmapViewOfFile( f_view );
f_open := FALSE;
end;
end; function TMapTextfile.CalcPos( pos : INTEGER ) : PChar;
begin
Result := nil;
if f_open then
begin
if pos < then
pos := ;
if pos > f_size then
pos := f_size;
Result := PChar( LONGINT( f_view ) + pos );
end;
end; function TMapTextfile.ReadChar : CHAR;
begin
Result := #;
if f_open then
begin
f_data := PChar( LONGINT( f_view ) + f_pos );
Result := f_data^;
INC( f_pos );
end;
end; function TMapTextfile.ReadString : string;
begin
Result := '';
if f_open then
begin
f_data := PChar( LONGINT( f_view ) + f_pos );
while ( f_pos < f_size ) do
begin
case f_data^ of
# .. # :
case f_data^ of
#, # :
Result := Result + f_data^; // Tab und Escape weiterreichen
# :
begin
INC( f_pos );
EXIT;
end;
# :
begin // Carriage Return terminiert
INC( f_pos );
INC( f_data );
if f_data^ = # then
INC( f_pos );
EXIT;
end;
end;
else
Result := Result + f_data^;
end;
INC( f_pos );
INC( f_data );
end;
end;
end; function TMapTextfile.ReadCharAt( pos : LONGINT ) : CHAR;
begin
if f_open then
Result := CalcPos( pos )^
else
Result := #;
end; procedure TMapTextfile.ReadChars( str : PChar; pos, len : LONGINT );
var
i : INTEGER;
p : PChar;
begin
if f_open then
begin
if len <= then
EXIT;
i := ;
p := CalcPos( pos );
while ( i <= f_size ) and ( i <= len ) do
begin
str^ := p^;
INC( str );
INC( p );
INC( i );
end;
end;
end; procedure TMapTextfile.ReadBytes( var b; pos, len : LONGINT );
var
p : PChar;
begin
if f_open then
begin
p := CalcPos( pos );
Move( p^, b, len );
end;
end; procedure TMapTextfile.WriteBytes( var b; pos, len : LONGINT );
var
p : PChar;
begin
if f_open then
begin
p := CalcPos( pos );
Move( b, p^, len );
end;
end; function TMapTextfile.ReadStringAt( pos : LONGINT ) : string;
var
i : INTEGER;
p : PChar;
begin
Result := '';
if f_open then
begin
p := CalcPos( pos );
i := ;
while ( i <= f_size ) do
begin
case p^ of
# .. # :
case p^ of
#, # :
Result := Result + p^; // Tabs und Escape weiterreichen
#, # :
EXIT; // Linefeed and Carriage Return terminiert
end;
else
Result := Result + p^;
end;
INC( p );
end;
end;
end; procedure TMapTextfile.ReadLn( var str : string );
begin
str := ReadString;
end; function TMapTextfile.GetSize : LONGINT;
begin
if f_open then
Result := f_size
else
Result := -;
end; function TMapTextfile.GetPos : LONGINT;
begin
if f_open then
Result := f_pos
else
Result := -;
end; procedure TMapTextfile.SetPos( pos : LONGINT );
begin
if f_open then
begin
if pos < then
pos := ;
if pos > f_size then
pos := f_size;
f_pos := pos;
end;
end; function TMapTextfile.EndOfFile : BOOLEAN;
begin
if f_open then
Result := f_pos >= f_size
else
Result := TRUE;
end; function TMapTextfile.FindString( const str : string; pos, max : INTEGER )
: INTEGER;
var
s, l1, j : INTEGER;
p, x : PChar;
begin
Result := -;
if f_open then
begin
if max <= then
max := f_size;
if pos < then
pos := f_pos;
if pos > max then
EXIT;
x := PChar( str );
p := PChar( f_view );
l1 := ;
while ( x[ l1 ] > # ) do
INC( l1 );
if ( l1 > ) then
begin
s := pos;
repeat (* 1 *)
j := ;
while ( s + j < max ) and ( j < l1 ) and ( x[ j ] = p[ s + j ] ) do
begin
INC( j );
if ( j = l1 ) then
begin
Result := s;
EXIT;
end;
end;
INC( s );
until s >= f_size;
end;
end;
end; function TMapTextfile.FindWildCard( const str : string; pos, max : INTEGER;
wild, joker : CHAR ) : INTEGER;
var
s, l1, j : INTEGER;
p, x : PChar;
begin
Result := -;
if f_open then
begin
if max <= then
max := f_size;
if pos < then
pos := f_pos;
if pos > max then
EXIT; x := PChar( str );
p := PChar( f_view );
l1 := ;
while ( x[ l1 ] > # ) do
INC( l1 ); if ( l1 > ) then
begin
s := pos;
repeat (* 1 *)
j := ;
while ( s + j < max ) and ( j < l1 ) and
( ( x[ j ] = p[ s + j ] ) or ( x[ j ] = joker ) ) do
begin
INC( j );
if ( x[ j ] = wild ) or ( j >= l1 ) then
begin
Result := s;
EXIT;
end;
end;
INC( s );
until s >= f_size;
end;
end;
end; end.
TMapTextfile v.99/1的更多相关文章
- 关于更新发布CSS和JS文件的缓存问题
现如今,浏览器大战下,各个浏览器也是拼了命的提高性能,升级JS解析引擎,更好的处理浏览器的页面缓存,让用户的浏览体验更快,占用更小的PC资源.那么,问题就出现在JS和CSS缓存,甚至页面缓存上.至于浏 ...
- java基础学习总结-接口
原文链接:http://www.cnblogs.com/xdp-gacl/p/3651121.html 一.接口的概念 JAVA是只支持单继承的,但现实之中存在多重继承这种现象,如"金丝猴是 ...
- aes加密C语言
/** * \file aes.h * * \brief AES block cipher * * Copyright (C) 2006-2010, Brainspark B.V. * * This ...
- CentOS_7 OpenWrt Eclipse 环境搭建与 Dr.com 开发笔记
一:内核的编译. 1,linux 编译环境的搭建与源码的准备工作 2,常用软件的安装 (make menuconfig) 3, 针对TP-Link WR740N 一些软件的openwrt 的移植 4 ...
- 转:小白编译openwrt固件教程
原文地址 编译openwrt固件并没有想象的那么复杂,我也是个小白,以下内容是我将网络上的编译教程稍微进行了一下整合.因为我发现很多编译教程没有说明如何更改flash相关配置. 安装ubuntu, ...
- Openwrt Image Builder/SDK 初探
image builder和SDK既可以从官网上下载,又可以自己进行编译(make menuconfig).官网上下载的是预先帮你编译好的,这样可以大量节省自己编译源码花的时间,这两个东西相当于半成品 ...
- 搭建自己的OpenWrt开发环境
1. 安装环境Linux系统,如果在CentOS上操作,需安装如下依赖包:yum install binutils bzip2 gawk gcc gcc-c++ gettext makencurse ...
- js文件被浏览器缓存的思考
我们的用户量大,修改js文件后,用户反馈登录出现问题.实际上刷新一下就没事了.就是因为用户的浏览器使用的还是本地缓存的js代码. 强制刷新一般就会重新去服务器获取新的js代码.但不能让用户 ...
- Openwrt 初探
最近想研究一下Openwrt,于是开始搭建openwrt环境,虽然现在没有现成的板子,但是 可以先编译起来. openwrt的特点是基于下载 -> patch -> 编译 的一个工作模式, ...
随机推荐
- opencv配置过程 (cmake,vs2013,qt 5.4)
平台及软件: Windows 7 X86 Visual Studio 2013 OpenCV3.0.0 Cmake3.3 1.下载Windows下的安装文件OpenCV-3.0.0.exe,解压,选择 ...
- java关键字(详解)
目录 1. 基本类型 1) boolean 布尔型 2) byte 字节型 3) char 字符型 4) double 双精度 5) float 浮点 6) int 整型 7) long 长整型 8) ...
- 解决uc浏览器不支持vw单位的方法
插入下段代码,使用rem来代替vw <script type="text/javascript"> (function (doc, win) { var docEl = ...
- c#元组举例
元组的概要: 数组合并了相同类型的对象,而元组合并了不同类型的对象.元组起源于函数编程语言(如F#) ,在 这些语言中频繁使用元组.在N盯4中,元组可通过.NET Fmmework用于所有的NET语言 ...
- day1 python简介和入门
Linux的yum依赖自带Python,为防止错误,此处更新其实就是再安装一个Python: 安装Python 1.下载安装包 https://www.python.org/downloads ...
- Java Switch Statement
Java Switch Java Switch Statement switch语句的执行规则如下 1.从第一个case开始判断,不匹配则跳到下一个case继续判断: 2.遇到brea ...
- Webpack, VSCode 和 Babel 组件模块导入别名
很多时候我们使用别人的库,都是通过 npm install,再简单的引入,就可以使用了. 1 2 import React from 'react' import { connect } fr ...
- ref:如何在大量jar包中搜索特定字符
ref:https://www.cnblogs.com/jiangxinnju/p/5137760.html?utm_source=tuicool&utm_medium=referral 如何 ...
- Python的环境搭建——万丈高楼平地起
Python的环境搭建,远程连接,端口映射,虚拟机 写在正文之前 python语言的开发环境还是相对比较简单的,但是也是有很多需要注意的地方,对于初次接触python或者以前很少用到虚拟环境的朋友来说 ...
- zabbix安装配置(2.4.5)
这是第一次安装配置,直接遭遇配置文件不明晰的大坑,因在编译阶段未指明配置文件路径,导致zabbix_server启动时直接读取默认的 /usr/local/zabbix/etc/zabbix_serv ...