unit uUnicodeStream;
{$mode delphi}
interface
uses
Classes, SysUtils;
type
// fpc 2.6.x and lower is ansi on windows this stream supports unicode filename.
// on linux the filename is already utf8 and compatible with lcl.
{ TUnicodeFileStream }
TUnicodeFileStream = class(THandleStream)
private
FFileName : UnicodeString;
public
constructor Create(const AFileName: UnicodeString; Mode: Word);overload;
constructor Create(const AFileName: UnicodeString; Mode: Word; Rights: Cardinal);overload;
destructor Destroy; override;
property FileName : UnicodeString Read FFilename;
end;
implementation
uses {$IFDEF MSWINDOWS}windows, {$ELSE} LazFileUtils,{$ENDIF} RtlConsts;
{$IFDEF MSWINDOWS}
const
AccessMode: array[0..2] of Cardinal = (
GENERIC_READ,
GENERIC_WRITE,
GENERIC_READ or GENERIC_WRITE or FILE_WRITE_ATTRIBUTES);
ShareModes: array[0..4] of Integer = (
0,
0,
FILE_SHARE_READ,
FILE_SHARE_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE);
Function FileCreate (Const FileName : unicodeString; ShareMode : Integer; Rights : Integer) : THandle;overload;inline;
begin
Result := CreateFileW(PWideChar(FileName), GENERIC_READ or GENERIC_WRITE,
dword(ShareModes[(ShareMode and $F0) shr 4]), nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
end;
Function FileOpen (Const FileName : unicodestring; Mode : Integer) : THandle; inline;
begin
result := CreateFileW(PWideChar(FileName), dword(AccessMode[Mode and 3]),
dword(ShareModes[(Mode and $F0) shr 4]), nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
end;
{$ELSE}
Function FileCreate (Const FileName : unicodeString; ShareMode : Integer; Rights : Integer) : THandle;overload;inline;
begin
Result := FileCreateUTF8(UTF8Encode(FileName), ShareMode, Rights);
end;
Function FileOpen (Const FileName : unicodestring; Mode : Integer) : THandle;inline;
begin
result := FileOpenUTF8(UTF8Encode(FileName), Mode);
end;
{$ENDIF}
Function FileCreate (Const FileName : unicodeString) : THandle; overload;
begin
FileCreate := FileCreate(FileName, fmShareExclusive, 0);
end;
Function FileCreate (Const FileName : unicodeString; Rights:longint) : THandle;overload;
begin
FileCreate:=FileCreate(FileName, fmShareExclusive, Rights);
end;
{$REGION ' TUnicodeFileStream '}
constructor TUnicodeFileStream.Create(const AFileName :UnicodeString; Mode :Word);
begin
Create(AFileName,Mode,438);
end;
constructor TUnicodeFileStream.Create(const AFileName: UnicodeString; Mode: Word; Rights: Cardinal);
var
vHandle :THandle;
begin
FFileName:=AFileName;
If (Mode and fmCreate) > 0 then vHandle := FileCreate(AFileName,Mode,Rights)
else vHandle := FileOpen(AFileName,Mode);
If (vHandle=feInvalidHandle) then
If Mode=fmcreate then raise EFCreateError.createfmt(SFCreateError,[AFileName])
else raise EFOpenError.Createfmt(SFOpenError,[AFilename]);
Create(vHandle);
end;
destructor TUnicodeFileStream.Destroy;
begin
FileClose(Handle);
inherited;
end;
{$ENDREGION}
end.