Изменение регистра символов в файле через отображение в память

Советы » Файлы » Изменение регистра символов в файле через отображение в память

{
Copyright © 1999 by Delphi 5 Developer's Guide - Xavier Pacheco and Steve Teixeira
}

unit

MainFrm; interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const

FName = 'test.txt'; type

TMainForm = class

(TForm) btnUpperCase: TButton; memTextContents: TMemo; lblContents: TLabel; btnLowerCase: TButton; procedure

btnUpperCaseClick(Sender: TObject); procedure

FormCreate(Sender: TObject); procedure

btnLowerCaseClick(Sender: TObject); public

UCase: Boolean; procedure

ChangeFileCase; end

; var

MainForm: TMainForm; implementation

{$R *.DFM} procedure

TMainForm.btnUpperCaseClick(Sender: TObject); begin

UCase := True; ChangeFileCase; end

; procedure

TMainForm.btnLowerCaseClick(Sender: TObject); begin

UCase := False; ChangeFileCase; end

; procedure

TMainForm.FormCreate(Sender: TObject); begin

memTextContents.Lines.LoadFromFile(FName); // Change to upper case by default. UCase := True; end

; procedure

TMainForm.ChangeFileCase; var

FFileHandle: THandle; // Handle to the open file. FMapHandle: THandle; // Handle to a file-mapping object FFileSize: Integer; // Variable to hold the file size. FData: PByte; // Pointer to the file's data when mapped. PData: PChar; // Pointer used to reference the file data. begin

{ First obtain a file handle to the file to be mapped. This code assumes the existence of the file. Otherwise, you can use the FileCreate() function to create a new file. } if

not

FileExists(FName) then

raise

Exception.Create('File does not exist.') else

FFileHandle := FileOpen(FName, fmOpenReadWrite); // If CreateFile() was not successful, raise an exception if

FFileHandle = INVALID_HANDLE_VALUE then

raise

Exception.Create('Failed to open or create file'); try

{ Now obtain the file size which we will pass to the other file- mapping functions. We'll make this size one byte larger as we need to append a null-terminating character to the end of the mapped-file's data.} FFileSize := GetFileSize(FFileHandle, nil

); { Obtain a file-mapping object handle. If this function is not successful, then raise an exception. } FMapHandle := CreateFileMapping(FFileHandle, nil

, PAGE_READWRITE, 0, FFileSize, nil

); if

FMapHandle = 0 then

raise

Exception.Create('Failed to create file mapping'); finally

// Release the file handle CloseHandle(FFileHandle); end

; try

{ Map the file-mapping object to a view. This will return a pointer to the file data. If this function is not successful, then raise an exception. } FData := MapViewOfFile(FMapHandle, FILE_MAP_ALL_ACCESS, 0, 0, FFileSize); if

FData = nil

then

raise

Exception.Create('Failed to map view of file'); finally

// Release the file-mapping object handle CloseHandle(FMapHandle); end

; try

{ !!! Here is where you would place the functions to work with the mapped file's data. For example, the following line forces all characters in the file to uppercase } PData := PChar(FData); // Position the pointer to the end of the file's data inc(PData, FFileSize); // Append a null-terminating character to the end of the file's data PData^ := #0; // Now set all characters in the file to uppercase if

UCase then

StrUpper(PChar(FData)) else

StrLower(PChar(FData)); finally

// Release the file mapping. UnmapViewOfFile(FData); end

; memTextContents.Lines.Clear; memTextContents.Lines.LoadFromFile(FName); end

; end

.

Другое по теме:

Категории

Статьи

Советы

Copyright © 2022 - All Rights Reserved - www.delphirus.com