📄 filemapping.pas.svn-base
字号:
unit FileMapping;
{
Wrapper class for filemapping
version 0.1: Only supports opening of exisiting files and no appending
version 0.2: copy on write, you can now write to it without actually messing up the file
}
interface
uses windows,classes,SysUtils;
type TFileMapping=class
private
FileHandle: THandle;
FileMapping: THandle;
FFileContent: pointer;
FFileSize: Dword;
public
property fileContent: pointer read FFileContent;
property filesize: dword read FFileSize;
constructor create(filename: string);
destructor destroy; override;
end;
implementation
destructor TFileMapping.destroy;
begin
//clean up the mapping
if FFileContent<>nil then
UnmapViewOfFile(FFileContent);
if FileMapping<>0 then
CloseHandle(FileMapping);
if FileHandle<>0 then
CloseHandle(FileHandle);
inherited destroy;
end;
constructor TFileMapping.create(filename: string);
begin
inherited create;
try
//open file
FileHandle := CreateFile(PChar(filename), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if FileHandle = INVALID_HANDLE_VALUE then raise exception.create(filename+' does not exist');
FFileSize:=GetFileSize(FileHandle,nil);
//still here, so create filemapping
FileMapping := CreateFileMapping(FileHandle, nil, PAGE_WRITECOPY , 0, 0, nil);
if FileMapping = 0 then raise exception.create('Mapping failed');
//map it completly
FFileContent:= MapViewOfFile(FileMapping, FILE_MAP_COPY , 0, 0, 0);
if FFileContent=nil then raise exception.Create('Failed creating a proper view');
except
on e: exception do
begin
if (FileMapping<>0) and (filemapping<>INVALID_HANDLE_VALUE) then
CloseHandle(FileMapping);
if (FileHandle<>0) and (FileHandle<>INVALID_HANDLE_VALUE) then
CloseHandle(FileHandle);
raise e;
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -