UPD: Refactoring

This commit is contained in:
Alexander Koblov 2019-12-14 12:16:22 +00:00
commit ffc19df91f
2 changed files with 25 additions and 56 deletions

View file

@ -3,7 +3,7 @@
-------------------------------------------------------------------------
This module contains classes with UTF8 file names support.
Copyright (C) 2008-2016 Alexander Koblov (alexx2000@mail.ru)
Copyright (C) 2008-2019 Alexander Koblov (alexx2000@mail.ru)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -34,13 +34,11 @@ type
{ TFileStreamEx class }
TFileStreamEx = class(THandleStream)
private
FHandle: THandle;
FFileName: String;
protected
FFileName: String;
procedure SetSize64(const NewSize: Int64); override;
public
constructor Create(const AFileName: String; Mode: LongWord);
constructor Create(const AFileName: String; Mode: LongWord); virtual; overload;
destructor Destroy; override;
function Flush: Boolean;
function Read(var Buffer; Count: LongInt): LongInt; override;
@ -78,26 +76,28 @@ uses
procedure TFileStreamEx.SetSize64(const NewSize: Int64);
begin
FileAllocate(FHandle, NewSize);
FileAllocate(Handle, NewSize);
end;
constructor TFileStreamEx.Create(const AFileName: String; Mode: LongWord);
var
AHandle: System.THandle;
begin
if (Mode and fmCreate) <> 0 then
begin
FHandle:= mbFileCreate(AFileName, Mode);
if FHandle = feInvalidHandle then
AHandle:= mbFileCreate(AFileName, Mode);
if AHandle = feInvalidHandle then
raise EFCreateError.CreateFmt(SFCreateError, [AFileName])
else
inherited Create(FHandle);
inherited Create(AHandle);
end
else
begin
FHandle:= mbFileOpen(AFileName, Mode);
if FHandle = feInvalidHandle then
AHandle:= mbFileOpen(AFileName, Mode);
if AHandle = feInvalidHandle then
raise EFOpenError.CreateFmt(SFOpenError, [AFilename])
else
inherited Create(FHandle);
inherited Create(AHandle);
end;
FFileName:= AFileName;
end;
@ -106,17 +106,17 @@ destructor TFileStreamEx.Destroy;
begin
inherited Destroy;
// Close handle after destroying the base object, because it may use Handle in Destroy.
if FHandle <> feInvalidHandle then FileClose(FHandle);
if Handle <> feInvalidHandle then FileClose(Handle);
end;
function TFileStreamEx.Flush: Boolean;
begin
Result:= FileFlush(FHandle);
Result:= FileFlush(Handle);
end;
function TFileStreamEx.Read(var Buffer; Count: LongInt): LongInt;
begin
Result:= FileRead(FHandle, Buffer, Count);
Result:= FileRead(Handle, Buffer, Count);
if Result = -1 then
raise EReadError.Create(mbSysErrorMessage(GetLastOSError));
end;

View file

@ -38,18 +38,9 @@ type
{ TFileStreamUAC class }
TFileStreamUAC = class(THandleStream)
private
FHandle: THandle;
FFileName: String;
protected
procedure SetSize64(const NewSize: Int64); override;
TFileStreamUAC = class(TFileStreamEx)
public
constructor Create(const AFileName: String; Mode: LongWord);
destructor Destroy; override;
function Flush: Boolean;
function Read(var Buffer; Count: LongInt): LongInt; override;
property FileName: String read FFileName;
constructor Create(const AFileName: String; Mode: LongWord); override;
end;
{ TStringListUAC }
@ -391,51 +382,29 @@ end;
{ TFileStreamUAC }
procedure TFileStreamUAC.SetSize64(const NewSize: Int64);
begin
FileAllocate(FHandle, NewSize);
end;
constructor TFileStreamUAC.Create(const AFileName: String; Mode: LongWord);
var
AHandle: System.THandle;
begin
if (Mode and fmCreate) <> 0 then
begin
FHandle:= FileCreateUAC(AFileName, Mode);
if FHandle = feInvalidHandle then
AHandle:= FileCreateUAC(AFileName, Mode);
if AHandle = feInvalidHandle then
raise EFCreateError.CreateFmt(SFCreateError, [AFileName])
else
inherited Create(FHandle);
inherited Create(AHandle);
end
else
begin
FHandle:= FileOpenUAC(AFileName, Mode);
if FHandle = feInvalidHandle then
AHandle:= FileOpenUAC(AFileName, Mode);
if AHandle = feInvalidHandle then
raise EFOpenError.CreateFmt(SFOpenError, [AFilename])
else
inherited Create(FHandle);
inherited Create(AHandle);
end;
FFileName:= AFileName;
end;
destructor TFileStreamUAC.Destroy;
begin
inherited Destroy;
// Close handle after destroying the base object, because it may use Handle in Destroy.
if FHandle <> feInvalidHandle then FileClose(FHandle);
end;
function TFileStreamUAC.Flush: Boolean;
begin
Result:= FileFlush(FHandle);
end;
function TFileStreamUAC.Read(var Buffer; Count: LongInt): LongInt;
begin
Result:= FileRead(FHandle, Buffer, Count);
if Result = -1 then
raise EReadError.Create(mbSysErrorMessage(GetLastOSError));
end;
{ TStringListUAC }
procedure TStringListUAC.LoadFromFile(const FileName: String);