fpc/rtl/objpas/sysutils/filutil.inc

903 lines
24 KiB
PHP

{
This file is part of the Free Pascal run time library.
Copyright (c) 2012 by the Free Pascal development team
File utility calls
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
{$ifndef SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
Function FileOpen (Const FileName : unicodestring; Mode : Integer) : THandle;
begin
Result:=FileOpen(ToSingleByteFileSystemEncodedFileName(FileName),Mode);
end;
Function FileCreate (Const FileName : UnicodeString) : THandle;
begin
Result:=FileCreate(ToSingleByteFileSystemEncodedFileName(FileName));
end;
Function FileCreate (Const FileName : UnicodeString; Rights : Integer) : THandle;
begin
Result:=FileCreate(ToSingleByteFileSystemEncodedFileName(FileName),Rights);
end;
Function FileCreate (Const FileName : UnicodeString; ShareMode : Integer; Rights : Integer) : THandle;
begin
Result:=FileCreate(ToSingleByteFileSystemEncodedFileName(FileName),ShareMode,Rights);
end;
Function FileAge (Const FileName : UnicodeString): Int64;
begin
Result:=FileAge(ToSingleByteFileSystemEncodedFileName(FileName));
end;
Function FileExists (Const FileName : UnicodeString; FollowLink : Boolean) : Boolean;
begin
Result:=FileExists(ToSingleByteFileSystemEncodedFileName(FileName), FollowLink);
end;
Function DirectoryExists (Const Directory : UnicodeString; FollowLink : Boolean) : Boolean;
begin
Result:=DirectoryExists(ToSingleByteFileSystemEncodedFileName(Directory), FollowLink);
end;
Function FileGetAttr (Const FileName : UnicodeString) : Longint;
begin
Result:=FileGetAttr(ToSingleByteFileSystemEncodedFileName(FileName));
end;
Function FileSetAttr (Const Filename : UnicodeString; Attr: longint) : Longint;
begin
Result:=FileSetAttr(ToSingleByteFileSystemEncodedFileName(FileName),Attr);
end;
Function DeleteFile (Const FileName : UnicodeString) : Boolean;
begin
Result:=DeleteFile(ToSingleByteFileSystemEncodedFileName(FileName));
end;
Function RenameFile (Const OldName, NewName : UnicodeString) : Boolean;
begin
Result:=RenameFile(ToSingleByteFileSystemEncodedFileName(OldName),
ToSingleByteFileSystemEncodedFileName(NewName));
end;
{$ifdef OS_FILEISREADONLY}
Function FileIsReadOnly(const FileName: UnicodeString): Boolean;
begin
Result:=FileIsReadOnly(ToSingleByteFileSystemEncodedFileName(FileName));
end;
{$endif}
{$ifdef OS_FILESETDATEBYNAME}
Function FileSetDate (Const FileName : UnicodeString;Age : Int64) : Longint;
begin
Result:=FileSetDate(ToSingleByteFileSystemEncodedFileName(FileName),Age);
end;
{$endif}
function FileAge(const FileName: RawByteString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;
Var
Info : TRawByteSearchRec;
A : Integer;
begin
for A:=1 to Length(FileName) do
if CharInSet(FileName[A],['?','*']) then
Exit(False);
A:=0;
if not FollowLink then
A:=A or faSymLink;
Result:=FindFirst(FileName,A,Info)=0;
if Result then
begin
FileDateTime:=FileDatetoDateTime(Info.Time);
FindClose(Info);
end;
end;
function FileAgeUTC(const FileName: RawByteString; out FileDateTimeUTC: TDateTime; FollowLink: Boolean = True): Boolean;
Var
Info : TRawByteSearchRec;
A : Integer;
begin
for A:=1 to Length(FileName) do
if CharInSet(FileName[A],['?','*']) then
Exit(False);
A:=0;
if not FollowLink then
A:=A or faSymLink;
Result:=FindFirst(FileName,A,Info)=0;
if Result then
begin
FileDateTimeUTC:=FileDateToUniversal(Info.Time);
FindClose(Info);
end;
end;
Function FileAge(const FileName: UnicodeString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;
begin
Result:=FileAge(ToSingleByteFileSystemEncodedFileName(FileName),FileDateTime,FollowLink);
end;
Function FileAgeUTC(const FileName: UnicodeString; out FileDateTimeUTC: TDateTime; FollowLink: Boolean = True): Boolean;
begin
Result:=FileAgeUTC(ToSingleByteFileSystemEncodedFileName(FileName),FileDateTimeUTC,FollowLink);
end;
function FileGetSymLinkTarget(const FileName: UnicodeString; out SymLinkRec: TUnicodeSymLinkRec): Boolean;
var
sr: TRawbyteSymLinkRec;
begin
Result := FileGetSymLinkTarget(ToSingleByteFileSystemEncodedFileName(FileName), sr);
if Result then
begin
SymLinkRec.TargetName := UnicodeString(sr.TargetName);
SymLinkRec.Size := sr.Size;
SymLinkRec.Attr := sr.Attr;
{$ifdef SYMLINKREC_USEFINDDATA}
SymLinkRec.FindData := sr.FindData;
{$endif}
{$ifdef unix}
SymLinkRec.Mode := sr.Mode;
{$endif}
end;
end;
Function FileSearch (Const Name, DirList : UnicodeString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : UnicodeString;
begin
Result:=UnicodeString(FileSearch(ToSingleByteFileSystemEncodedFileName(Name),
ToSingleByteFileSystemEncodedFileName(Dirlist),Options));
end;
Function FileSearch (Const Name, DirList : UnicodeString; ImplicitCurrentDir : Boolean) : UnicodeString;
begin
Result:=UnicodeString(FileSearch(ToSingleByteFileSystemEncodedFileName(Name),
ToSingleByteFileSystemEncodedFileName(DirList),ImplicitCurrentDir));
end;
Function ExeSearch (Const Name : UnicodeString; Const DirList : UnicodeString ='' ) : UnicodeString;
begin
Result:=UnicodeString(ExeSearch(ToSingleByteFileSystemEncodedFileName(Name),
ToSingleByteFileSystemEncodedFileName(Dirlist)));
end;
Function FileSearch (Const Name, DirList : RawByteString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : RawByteString;
Var
I : longint;
Temp : RawByteString;
begin
Result:=Name;
temp:=SetDirSeparators(DirList);
// Start with checking the file in the current directory
If (sfoImplicitCurrentDir in Options) and (Result <> '') and FileExists(Result) Then
exit;
while True do begin
If Temp = '' then
Break; // No more directories to search - fail
I:=pos(PathSeparator,Temp);
If I<>0 then
begin
Result:=Copy (Temp,1,i-1);
system.Delete(Temp,1,I);
end
else
begin
Result:=Temp;
Temp:='';
end;
If Result<>'' then
begin
If (sfoStripQuotes in Options) and (Result[1]='"') and (Result[Length(Result)]='"') then
Result:=Copy(Result,2,Length(Result)-2);
if (Result<>'') then
Result:=IncludeTrailingPathDelimiter(Result)+name;
end;
If (Result <> '') and FileExists(Result) Then
exit;
end;
Result:='';
end;
Function FileSearch (Const Name, DirList : RawByteString; ImplicitCurrentDir : Boolean) : RawByteString;
begin
if ImplicitCurrentDir then
Result:=FileSearch(Name,DirList,[sfoImplicitCurrentDir])
else
Result:=FileSearch(Name,DirList,[]);
end;
Function ExeSearch (Const Name : RawByteString; Const DirList : RawByteString ='' ) : RawByteString;
Var
D : RawByteString;
O : TFileSearchOptions;
begin
D:=DirList;
if (D='') then
D:=GetEnvironmentVariable('PATH');
{$ifdef unix}
O:=[];
{$else unix}
O:=[sfoImplicitCurrentDir,sfoStripQuotes];
{$endif unix}
Result := FileSearch(Name, D, O);
end;
{$endif}
{$ifndef SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
Function FileOpen (Const FileName : rawbytestring; Mode : Integer) : THandle;
begin
Result:=FileOpen(UnicodeString(FileName),Mode);
end;
Function FileCreate (Const FileName : RawByteString) : THandle;
begin
Result:=FileCreate(UnicodeString(FileName));
end;
Function FileCreate (Const FileName : RawByteString; Rights : Integer) : THandle;
begin
Result:=FileCreate(UnicodeString(FileName),Rights);
end;
Function FileCreate (Const FileName : RawByteString; ShareMode : Integer; Rights : Integer) : THandle;
begin
Result:=FileCreate(UnicodeString(FileName),ShareMode,Rights);
end;
Function FileAge (Const FileName : RawByteString): Int64;
begin
Result:=FileAge(UnicodeString(FileName));
end;
Function FileExists (Const FileName : RawByteString; FollowLink : Boolean) : Boolean;
begin
Result:=FileExists(UnicodeString(FileName), FollowLink);
end;
Function DirectoryExists (Const Directory : RawByteString; FollowLink : Boolean) : Boolean;
begin
Result:=DirectoryExists(UnicodeString(Directory), FollowLink);
end;
Function FileGetAttr (Const FileName : RawByteString) : Longint;
begin
Result:=FileGetAttr(unicodestring(FileName));
end;
Function FileSetAttr (Const Filename : RawByteString; Attr: longint) : Longint;
begin
Result:=FileSetAttr(unicodestring(FileName),Attr);
end;
Function DeleteFile (Const FileName : RawByteString) : Boolean;
begin
Result:=DeleteFile(UnicodeString(FileName));
end;
Function RenameFile (Const OldName, NewName : RawByteString) : Boolean;
begin
Result:=RenameFile(UnicodeString(OldName),UnicodeString(NewName));
end;
{$ifdef OS_FILEISREADONLY}
Function FileIsReadOnly(const FileName: RawByteString): Boolean;
begin
Result:=FileIsReadOnly(UnicodeString(FileName));
end;
{$endif}
{$ifdef OS_FILESETDATEBYNAME}
Function FileSetDate (Const FileName : RawByteString;Age : Int64) : Longint;
begin
Result:=FileSetDate(UnicodeString(FileName),Age);
end;
{$endif}
function FileAge(const FileName: UnicodeString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;
Var
Info : TUnicodeSearchRec;
A : Integer;
begin
for A:=1 to Length(FileName) do
if CharInSet(FileName[A],['?','*']) then
Exit(False);
A:=0;
if not FollowLink then
A:=A or faSymLink;
Result:=FindFirst(FileName,A,Info)=0;
if Result then
begin
FileDateTime:=Info.TimeStamp;
FindClose(Info);
end;
end;
function FileAgeUTC(const FileName: UnicodeString; out FileDateTimeUTC: TDateTime; FollowLink: Boolean = True): Boolean;
Var
Info : TUnicodeSearchRec;
A : Integer;
begin
for A:=1 to Length(FileName) do
if CharInSet(FileName[A],['?','*']) then
Exit(False);
A:=0;
if not FollowLink then
A:=A or faSymLink;
Result:=FindFirst(FileName,A,Info)=0;
if Result then
begin
FileDateTimeUTC:=Info.TimeStampUTC;
FindClose(Info);
end;
end;
Function FileAge(const FileName: RawbyteString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;
begin
Result:=FileAge(UnicodeString(FileName),FileDateTime,FollowLink);
end;
function FileAgeUTC(const FileName: RawByteString; out FileDateTimeUTC: TDateTime; FollowLink: Boolean = True): Boolean;
begin
Result:=FileAgeUTC(UnicodeString(FileName),FileDateTimeUTC,FollowLink);
end;
function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
var
sr: TUnicodeSymLinkRec;
begin
Result := FileGetSymLinkTarget(UnicodeString(FileName), sr);
if Result then
begin
SymLinkRec.TargetName := ToSingleByteFileSystemEncodedFileName(sr.TargetName);
SymLinkRec.Size := sr.Size;
SymLinkRec.Attr := sr.Attr;
{$ifdef SYMLINKREC_USEFINDDATA}
SymLinkRec.FindData := sr.FindData;
{$endif}
{$ifdef unix}
SymLinkRec.Mode := sr.Mode;
{$endif}
end;
end;
Function FileSearch (Const Name, DirList : UnicodeString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : UnicodeString;
Var
I : longint;
Temp : UnicodeString;
begin
Result:=Name;
temp:=SetDirSeparators(DirList);
// Start with checking the file in the current directory
If (sfoImplicitCurrentDir in Options) and (Result <> '') and FileExists(Result) Then
exit;
while True do begin
If Temp = '' then
Break; // No more directories to search - fail
I:=pos(PathSeparator,Temp);
If I<>0 then
begin
Result:=Copy (Temp,1,i-1);
system.Delete(Temp,1,I);
end
else
begin
Result:=Temp;
Temp:='';
end;
If Result<>'' then
begin
If (sfoStripQuotes in Options) and (Result[1]='"') and (Result[Length(Result)]='"') then
Result:=Copy(Result,2,Length(Result)-2);
if (Result<>'') then
Result:=IncludeTrailingPathDelimiter(Result)+name;
end;
If (Result <> '') and FileExists(Result) Then
exit;
end;
Result:='';
end;
Function FileSearch (Const Name, DirList : RawbyteString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : RawByteString;
begin
Result:=ToSingleByteFileSystemEncodedFileName(FileSearch(unicodestring(name),unicodestring(dirlist),options));
end;
Function FileSearch (Const Name, DirList : RawbyteString; ImplicitCurrentDir : Boolean) : RawByteString;
begin
Result:=ToSingleByteFileSystemEncodedFileName(FileSearch(unicodestring(name),unicodestring(dirlist),ImplicitCurrentDir));
end;
Function FileSearch (Const Name, DirList : UnicodeString; ImplicitCurrentDir : Boolean) : UnicodeString;
begin
if ImplicitCurrentDir then
Result:=FileSearch(Name,DirList,[sfoImplicitCurrentDir])
else
Result:=FileSearch(Name,DirList,[]);
end;
Function ExeSearch (Const Name : UnicodeString; Const DirList : UnicodeString ='' ) : UnicodeString;
Var
D : UnicodeString;
O : TFileSearchOptions;
begin
D:=DirList;
if (D='') then
D:=UnicodeString(GetEnvironmentVariable('PATH'));
{$ifdef unix}
O:=[];
{$else unix}
O:=[sfoImplicitCurrentDir,sfoStripQuotes];
{$endif unix}
Result := FileSearch(Name, D, O);
end;
Function ExeSearch (Const Name : RawbyteString; Const DirList : RawbyteString ='' ) : RawByteString;
begin
Result:=ToSingleByteFileSystemEncodedFileName(ExeSearch(unicodestring(name),unicodestring(dirlist)));
end;
{$endif}
function FileGetSymLinkTarget(const FileName: UnicodeString; out TargetName: UnicodeString): Boolean;
var
sr: TUnicodeSymLinkRec;
begin
Result := FileGetSymLinkTarget(FileName, sr);
if Result then
TargetName := sr.TargetName;
end;
function FileGetSymLinkTarget(const FileName: RawByteString; out TargetName: RawByteString): Boolean;
var
sr: TRawbyteSymLinkRec;
begin
Result := FileGetSymLinkTarget(FileName, sr);
if Result then
TargetName := sr.TargetName;
end;
Function GetFileHandle(var f : File):THandle;
begin
Result:=filerec(f).handle;
end;
Function GetFileHandle(var f : Text):THandle;
begin
Result:=textrec(f).handle;
end;
{ FindFirst/FindNext. In order to avoid having to duplicate most code in th
OS-specific implementations, we let those implementations fill in all
fields of TRawbyte/UnicodeSearchRec, except for the name. That field is
filled in by the OS-indepedent wrappers, which also takes care of setting
the appropriate code page if applicable.
}
type
TAbstractSearchRec = Record
Time : Int64;
Size : Int64;
Attr : Longint;
{ this will be assigned by the generic code; it is actually either a
rawbytestring or unicodestring; keep it a reference-counted type
so that -gt doesn't overwrite it, the field name should be
indication enough that you should not touch it }
Name_do_not_touch : RawByteString;
ExcludeAttr : Longint;
FindHandle : {$ifdef FINDHANDLE_IS_POINTER}Pointer{$else}THandle{$endif};
{$ifdef unix}
Mode : TMode;
{$endif unix}
{$ifdef SEARCHREC_USEFINDDATA}
FindData : TFindData;
{$endif}
end;
{$ifdef SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
Function InternalFindFirst (Const Path : RawByteString; Attr : Longint; out Rslt : TAbstractSearchRec; var Name: RawByteString) : Longint; forward;
Function InternalFindNext (var Rslt : TAbstractSearchRec; var Name : RawByteString) : Longint; forward;
{$endif SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
{$ifdef SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
Function InternalFindFirst (Const Path : UnicodeString; Attr : Longint; out Rslt : TAbstractSearchRec; var Name: UnicodeString) : Longint; forward;
Function InternalFindNext (var Rslt : TAbstractSearchRec; var Name : UnicodeString) : Longint; forward;
{$endif SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
procedure InternalFindClose(var Handle: {$ifdef FINDHANDLE_IS_POINTER}Pointer{$else}THandle{$endif}{$ifdef SEARCHREC_USEFINDDATA};var FindData: TFindData{$endif}); forward;
{$ifndef SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
Function FindFirst (Const Path : RawByteString; Attr : Longint; out Rslt : TRawByteSearchRec) : Longint;
var
Name: UnicodeString;
begin
Result:=InternalFindFirst(UnicodeString(Path),Attr,TAbstractSearchRec(Rslt),Name);
if Result=0 then
widestringmanager.Unicode2AnsiMoveProc(PUnicodeChar(Name),Rslt.Name,DefaultRTLFileSystemCodePage,length(Name));
end;
Function FindNext (Var Rslt : TRawByteSearchRec) : Longint;
var
Name: UnicodeString;
begin
Result:=InternalFindNext(TAbstractSearchRec(Rslt),Name);
if Result=0 then
widestringmanager.Unicode2AnsiMoveProc(PUnicodeChar(Name),Rslt.Name,DefaultRTLFileSystemCodePage,length(Name));
end;
{$else not SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
Function FindFirst (Const Path : RawByteString; Attr : Longint; out Rslt : TRawByteSearchRec) : Longint;
begin
Result:=InternalFindFirst(Path,Attr,TAbstractSearchRec(Rslt),Rslt.Name);
if Result=0 then
SetCodePage(Rslt.Name,DefaultRTLFileSystemCodePage);
end;
Function FindNext (Var Rslt : TRawByteSearchRec) : Longint;
begin
Result:=InternalFindNext(TAbstractSearchRec(Rslt),Rslt.Name);
if Result=0 then
SetCodePage(Rslt.Name,DefaultRTLFileSystemCodePage);
end;
{$endif not SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
{$ifndef SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
Function FindFirst (Const Path : UnicodeString; Attr : Longint; out Rslt : TUnicodeSearchRec) : Longint;
var
Name: RawByteString;
begin
Result:=InternalFindFirst(ToSingleByteFileSystemEncodedFileName(Path),Attr,TAbstractSearchRec(Rslt),Name);
if Result=0 then
Rslt.Name:=UnicodeString(Name);
end;
Function FindNext (Var Rslt : TUnicodeSearchRec) : Longint;
var
Name: RawByteString;
begin
Result:=InternalFindNext(TAbstractSearchRec(Rslt),Name);
if Result=0 then
Rslt.Name:=UnicodeString(Name);
end;
{$else not SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
Function FindFirst (Const Path : UnicodeString; Attr : Longint; out Rslt : TUnicodeSearchRec) : Longint;
begin
Result:=InternalFindFirst(Path,Attr,TAbstractSearchRec(Rslt),Rslt.Name);
end;
Function FindNext (Var Rslt : TUnicodeSearchRec) : Longint;
begin
Result:=InternalFindNext(TAbstractSearchRec(Rslt),Rslt.Name);
end;
{$endif not SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
Procedure FindClose(Var f: TRawByteSearchRec);
begin
InternalFindClose(f.FindHandle{$ifdef SEARCHREC_USEFINDDATA},f.FindData{$endif});
end;
Procedure FindClose(Var f: TUnicodeSearchRec);
begin
InternalFindClose(f.FindHandle{$ifdef SEARCHREC_USEFINDDATA},f.FindData{$endif});
end;
{$if defined(windows) and not defined(win16)}
function FindDataTimeToDateTime(constref aFileTime: FILETIME; out aResult: TDateTime): Boolean;
var
st, lt: TSystemTime;
begin
Result := FileTimeToSystemTime(aFileTime, st);
if Result then begin
{$ifndef wince}
if SystemTimeToTzSpecificLocalTime(Nil, st, lt) then
aResult := SystemTimeToDateTime(lt)
else
{$endif}
aResult := SystemTimeToDateTime(st);
end;
end;
function FindDataTimeToUTC(constref aFileTime: FILETIME; out aResult: TDateTime): Boolean;
var
st: TSystemTime;
begin
Result := FileTimeToSystemTime(aFileTime, st);
if Result then
aResult := SystemTimeToDateTime(st);
end;
{$endif}
{ TUnicodeSearchRec }
function TUnicodeSearchRec.GetTimeStamp: TDateTime;
begin
{$if declared(FindDataTimeToDateTime)}
if not FindDataTimeToDateTime(FindData.ftLastWriteTime, Result) then
{$endif}
Result := FileDateToDateTime(Time);
end;
function TUnicodeSearchRec.GetTimeStampUTC: TDateTime;
begin
{$if declared(FindDataTimeToUTC)}
if not FindDataTimeToUTC(FindData.ftLastWriteTime, Result) then
{$endif}
Result := FileDateToUniversal(Time);
end;
{ TRawbyteSearchRec }
function TRawbyteSearchRec.GetTimeStamp: TDateTime;
begin
{$if declared(FindDataTimeToDateTime)}
if not FindDataTimeToDateTime(FindData.ftLastWriteTime, Result) then
{$endif}
Result := FileDateToDateTime(Time);
end;
function TRawbyteSearchRec.GetTimeStampUTC: TDateTime;
begin
{$if declared(FindDataTimeToDateTime)}
if not FindDataTimeToUTC(FindData.ftLastWriteTime, Result) then
{$endif}
Result := FileDateToUniversal(Time);
end;
{ TUnicodeSymLinkRec }
function TUnicodeSymLinkRec.GetTimeStamp: TDateTime;
begin
{$if declared(FindDataTimeToDateTime)}
if not FindDataTimeToDateTime(FindData.ftLastWriteTime, Result) then
{$endif}
Result := 0;
end;
{ TRawbyteSymLinkRec }
function TRawbyteSymLinkRec.GetTimeStamp: TDateTime;
begin
{$if declared(FindDataTimeToDateTime)}
if not FindDataTimeToDateTime(FindData.ftLastWriteTime, Result) then
{$endif}
Result := 0;
end;
{$ifndef SYSUTILS_HAS_FILEFLUSH_IMPL}
function FileFlush(Handle: THandle): Boolean;
begin
Result:= False;
end;
{$endif}
Function GetFileContents(Const aFileName : RawByteString) : TBytes;
Var
H : Thandle;
begin
H:=FileOpen(aFileName,fmOpenRead or fmShareDenyWrite);
if H<0 then
Raise EFileNotFoundException.Create(SFileNotFound);
try
Result:=GetFileContents(H);
finally
FileClose(H);
end;
end;
Function GetFileContents(Const aFileName : UnicodeString) : TBytes;
Var
H : Thandle;
begin
H:=FileOpen(aFileName,fmOpenRead or fmShareDenyWrite);
if H<0 then
Raise EFileNotFoundException.Create(SFileNotFound);
try
Result:=GetFileContents(H);
finally
FileClose(H);
end;
end;
Function GetFileContents(Const aHandle : THandle) : TBytes;
Var
aLen,aOffset,aRead : Int64;
aBuf : PByte;
begin
aLen:=FileSeek(aHandle,0,fsFromEnd);
if aLen<0 then
Raise EInOutError.Create(SSeekFailed);
if FileSeek(aHandle,0,fsFromBeginning)<0 then
Raise EInOutError.Create(SSeekFailed);
SetLength(Result,aLen);
aOffset:=0;
Repeat
aBuf:=@Result[aOffset];
aRead:=FileRead(aHandle,aBuf^,aLen-aOffset);
aOffset:=aOffset+aRead;
Until (aOffset>=aLen) or (aRead<=0);
if aRead<0 then
RaiseLastOSError;
end;
Function GetFileAsString(Const aFileName : RawByteString; aEncoding : TEncoding) : RawByteString;
begin
Result:=aEncoding.GetAnsiString(GetFileContents(aFileName));
end;
Function GetFileAsString(Const aFileName : RawByteString) : RawByteString;
begin
Result:=GetFileAsString(aFileName,TEncoding.SystemEncoding);
end;
Function GetFileAsString(Const aFileName : UnicodeString) : UnicodeString;
begin
Result:=GetFileAsString(aFileName, TEncoding.Unicode);
end;
Function GetFileAsString(Const aFileName : UnicodeString; aEncoding : TEncoding) : UnicodeString;
begin
Result:=aEncoding.GetString(GetFileContents(aFileName))
end;
{$IFNDEF HAS_FILEDATETIME}
Function FileGetDate (Handle : THandle; out FileDateTime: TDateTime) : Boolean;
Var
aDate : Int64;
begin
aDate:=FileGetDate(Handle);
Result:=aDate>=0;
if Result then
FileDateTime:=FileDateToDateTime(aDate);
end;
Function FileGetDateUTC (Handle : THandle; out FileDateTimeUTC: TDateTime) : Boolean;
Var
aDate : Int64;
begin
aDate:=FileGetDate(Handle);
Result:=aDate>=0;
if Result then
FileDateTimeUTC:=FileDateToUniversal(aDate);
end;
Function FileSetDate (Handle : THandle; const FileDateTime: TDateTime) : Longint;
begin
Result := FileSetDate(Handle,DateTimeToFileDate(FileDateTime));
end;
Function FileSetDateUTC (Handle : THandle; const FileDateTimeUTC: TDateTime) : Longint;
begin
Result := FileSetDate(Handle,UniversalToFileDate(FileDateTimeUTC));
end;
Function FileSetDate (Const FileName : UnicodeString;const FileDateTime : TDateTime) : Longint;
begin
Result:=FileSetDate(FileName,DateTimeToFileDate(FileDateTime));
end;
Function FileSetDateUTC (Const FileName : UnicodeString;const FileDateTimeUTC : TDateTime) : Longint;
begin
Result:=FileSetDate(FileName,UniversalToFileDate(FileDateTimeUTC));
end;
{$ENDIF}
Function FileSetDate (Const FileName : RawByteString;const FileDateTime : TDateTime) : Longint;
begin
Result:=FileSetDate(UnicodeString(FileName),FileDateTime);
end;
Function FileSetDateUTC (Const FileName : RawByteString;const FileDateTimeUTC : TDateTime) : Longint;
begin
Result:=FileSetDateUTC(UnicodeString(FileName),FileDateTimeUTC);
end;
{$IFNDEF HAS_ISFILENAMECASESENSITIVE}
Function IsFileNameCaseSensitive(Const aFileName : RawByteString) : Boolean;
begin
Result:=FileNameCaseSensitive;
end;
Function IsFileNameCaseSensitive(Const aFileName : UnicodeString) : Boolean;
begin
Result:=FileNameCaseSensitive;
end;
{$ENDIF HAS_ISFILENAMECASESENSITIVE}
{$IFNDEF HAS_ISFILENAMECASEPRESERVING}
Function IsFileNameCasePreserving(Const aFileName : RawByteString) : Boolean;
begin
Result:=FileNameCasePreserving;
end;
Function IsFileNameCasePreserving(Const aFileName : UnicodeString) : Boolean;
begin
Result:=FileNameCasePreserving;
end;
{$ENDIF HAS_ISFILENAMECASEPRESERVING}