mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-26 22:23:49 +02:00
331 lines
8.3 KiB
PHP
331 lines
8.3 KiB
PHP
{%MainUnit lazfileutils.pas}
|
|
|
|
function FilenameIsAbsolute(const TheFilename: string):boolean;
|
|
begin
|
|
Result := Pos(':', TheFilename) > 1;
|
|
end;
|
|
|
|
function FileOpenUTF8(const FileName: string; Mode: Integer): THandle;
|
|
begin
|
|
Result := SysUtils.FileOpen(UTF8ToSys(FileName), Mode);
|
|
end;
|
|
|
|
function FileCreateUTF8(const FileName: string): THandle;
|
|
begin
|
|
Result := SysUtils.FileCreate(UTF8ToSys(FileName));
|
|
end;
|
|
|
|
function FileCreateUTF8(const FileName: string; Rights: Cardinal): THandle;
|
|
begin
|
|
Result := SysUtils.FileCreate(UTF8ToSys(FileName), Rights);
|
|
end;
|
|
|
|
function FileCreateUtf8(const FileName: String; ShareMode: Integer;
|
|
Rights: Cardinal): THandle;
|
|
begin
|
|
Result := SysUtils.FileCreate(UTF8ToSys(FileName), ShareMode, Rights);
|
|
end;
|
|
|
|
function FileGetAttrUTF8(const FileName: String): Longint;
|
|
begin
|
|
Result:=SysUtils.FileGetAttr(UTF8ToSys(Filename));
|
|
end;
|
|
|
|
function FileSetAttrUTF8(const Filename: String; Attr: longint): Longint;
|
|
begin
|
|
Result:=SysUtils.FileSetAttr(UTF8ToSys(Filename),Attr);
|
|
InvalidateFileStateCache(Filename);
|
|
end;
|
|
|
|
function FileExistsUTF8(const Filename: string): boolean;
|
|
begin
|
|
Result:=SysUtils.FileExists(UTF8ToSys(Filename));
|
|
end;
|
|
|
|
function DirectoryExistsUTF8(const Directory: string): Boolean;
|
|
begin
|
|
Result:=SysUtils.DirectoryExists(UTF8ToSys(Directory));
|
|
end;
|
|
|
|
function FileAgeUTF8(const FileName: string): Longint;
|
|
begin
|
|
Result:=SysUtils.FileAge(UTF8ToSys(Filename));
|
|
end;
|
|
|
|
function FileSetDateUTF8(const FileName: String; Age: Longint): Longint;
|
|
begin
|
|
Result := SysUtils.FileSetDate(UTF8ToSys(Filename), Age);
|
|
InvalidateFileStateCache(Filename);
|
|
end;
|
|
|
|
function FileSizeUtf8(const Filename: string): int64;
|
|
var
|
|
Info: TSearchRec;
|
|
Str: AnsiString;
|
|
begin
|
|
Result := 0;
|
|
Str := Utf8ToAnsi(Filename);
|
|
if SysUtils.FindFirst (str, faAnyFile and faDirectory, Info) = 0 then
|
|
begin
|
|
Result := Info.Size;
|
|
end;
|
|
SysUtils.FindClose(Info);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
function ReadAllLinks(const Filename: string;
|
|
ExceptionOnError: boolean): string;
|
|
------------------------------------------------------------------------------}
|
|
function ReadAllLinks(const Filename: string;
|
|
ExceptionOnError: boolean): string;
|
|
begin
|
|
Result:='';
|
|
end;
|
|
|
|
function GetPhysicalFilename(const Filename: string;
|
|
OnError: TPhysicalFilenameOnError): string;
|
|
begin
|
|
Result:=Filename;
|
|
end;
|
|
|
|
function CreateDirUTF8(const NewDir: String): Boolean;
|
|
begin
|
|
Result:=SysUtils.CreateDir(UTF8ToSys(NewDir));
|
|
end;
|
|
|
|
function RemoveDirUTF8(const Dir: String): Boolean;
|
|
begin
|
|
Result:=SysUtils.RemoveDir(UTF8ToSys(Dir));
|
|
end;
|
|
|
|
function DeleteFileUTF8(const FileName: String): Boolean;
|
|
begin
|
|
Result:=SysUtils.DeleteFile(UTF8ToSys(Filename));
|
|
if Result then
|
|
InvalidateFileStateCache;
|
|
end;
|
|
|
|
function RenameFileUTF8(const OldName, NewName: String): Boolean;
|
|
begin
|
|
Result:=SysUtils.RenameFile(UTF8ToSys(OldName),UTF8ToSys(NewName));
|
|
if Result then
|
|
InvalidateFileStateCache;
|
|
end;
|
|
|
|
function SetCurrentDirUTF8(const NewDir: String): Boolean;
|
|
begin
|
|
Result:=SysUtils.SetCurrentDir(UTF8ToSys(NewDir));
|
|
end;
|
|
|
|
function FindFirstUTF8(const Path: string; Attr: Longint; out Rslt: TSearchRec
|
|
): Longint;
|
|
begin
|
|
Result:=SysUtils.FindFirst(UTF8ToSys(Path),Attr,Rslt);
|
|
Rslt.Name:=SysToUTF8(Rslt.Name);
|
|
end;
|
|
|
|
function FindNextUTF8(var Rslt: TSearchRec): Longint;
|
|
begin
|
|
Rslt.Name:=UTF8ToSys(Rslt.Name);
|
|
Result:=SysUtils.FindNext(Rslt);
|
|
Rslt.Name:=SysToUTF8(Rslt.Name);
|
|
end;
|
|
|
|
|
|
function ExpandFileNameUTF8(const FileName: string; BaseDir: string): string;
|
|
var
|
|
IsAbs: Boolean;
|
|
CurDir, Fn: String;
|
|
begin
|
|
Fn := FileName;
|
|
ForcePathDelims(Fn);
|
|
IsAbs := FileNameIsAbsolute(Fn);
|
|
if (not IsAbs) then
|
|
begin
|
|
CurDir := GetCurrentDirUtf8;
|
|
end;
|
|
if IsAbs then
|
|
begin
|
|
Result := ResolveDots(Fn);
|
|
end
|
|
else
|
|
begin
|
|
if (BaseDir = '') then
|
|
Fn := IncludeTrailingPathDelimiter(CurDir) + Fn
|
|
else
|
|
Fn := IncludeTrailingPathDelimiter(BaseDir) + Fn;
|
|
Fn := ResolveDots(Fn);
|
|
//if BaseDir is not absolute then this needs to be expanded as well
|
|
if not FileNameIsAbsolute(Fn) then
|
|
Fn := ExpandFileNameUtf8(Fn, '');
|
|
Result := Fn;
|
|
end;
|
|
end;
|
|
|
|
function GetCurrentDirUTF8: String;
|
|
begin
|
|
Result:=SysToUTF8(SysUtils.GetCurrentDir);
|
|
end;
|
|
|
|
function FileIsExecutable(const AFilename: string): boolean;
|
|
var
|
|
Fn: string;
|
|
MyLock: BPTR;
|
|
Info: TFileInfoBlock;
|
|
begin
|
|
Result := False;
|
|
Fn := Utf8ToSys(AFilename);
|
|
MyLock := AmigaDos.Lock(PChar(Fn), SHARED_LOCK);
|
|
if PtrUInt(MyLock) <> 0 then
|
|
begin
|
|
Examine(MyLock, @Info);
|
|
Result := (Info.fib_Protection and FIBF_EXECUTE) <> 0;
|
|
AmigaDos.UnLock(MyLock);
|
|
end;
|
|
end;
|
|
|
|
procedure CheckIfFileIsExecutable(const AFilename: string);
|
|
begin
|
|
// TProcess does not report, if a program can not be executed
|
|
// to get good error messages consider the OS
|
|
if not FileExistsUTF8(AFilename) then begin
|
|
raise Exception.Create(SysUtils.Format(lrsFileDoesNotExist, [AFilename]));
|
|
end;
|
|
if DirPathExists(AFilename) then begin
|
|
raise Exception.Create(SysUtils.Format(lrsFileIsADirectoryAndNotAnExecutable, [
|
|
AFilename]));
|
|
end;
|
|
end;
|
|
|
|
function FileIsSymlink(const AFilename: string): boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure CheckIfFileIsSymlink(const AFilename: string);
|
|
begin
|
|
// to get good error messages consider the OS
|
|
if not FileExistsUTF8(AFilename) then begin
|
|
raise Exception.Create(SysUtils.Format(lrsFileDoesNotExist, [AFilename]));
|
|
end;
|
|
if not FileIsSymLink(AFilename) then
|
|
raise Exception.Create(SysUtils.Format(lrsIsNotASymbolicLink, [AFilename]));
|
|
end;
|
|
|
|
function FileIsHardLink(const AFilename: string): boolean;
|
|
begin
|
|
Result := false;
|
|
end;
|
|
|
|
function FileIsReadable(const AFilename: string): boolean;
|
|
var
|
|
Fn: string;
|
|
MyLock: BPTR;
|
|
Info: TFileInfoBlock;
|
|
begin
|
|
Result := False;
|
|
Fn := Utf8ToSys(AFilename);
|
|
MyLock := AmigaDos.Lock(PChar(Fn), SHARED_LOCK);
|
|
if PtrUInt(MyLock) <> 0 then
|
|
begin
|
|
Examine(MyLock, @Info);
|
|
Result := (Info.fib_Protection and FIBF_READ) <> 0;
|
|
AmigaDos.UnLock(MyLock);
|
|
end;
|
|
end;
|
|
|
|
function FileIsWritable(const AFilename: string): boolean;
|
|
var
|
|
Fn: string;
|
|
MyLock: BPTR;
|
|
Info: TFileInfoBlock;
|
|
begin
|
|
Result := False;
|
|
Fn := Utf8ToSys(AFilename);
|
|
MyLock := AmigaDos.Lock(PChar(Fn), SHARED_LOCK);
|
|
if PtrUInt(MyLock) <> 0 then
|
|
begin
|
|
Examine(MyLock, @Info);
|
|
Result := (Info.fib_Protection and FIBF_WRITE) <> 0;
|
|
AmigaDos.UnLock(MyLock);
|
|
end;
|
|
end;
|
|
|
|
|
|
function IsUNCPath(const Path: String): Boolean;
|
|
begin
|
|
Result := false;
|
|
end;
|
|
|
|
function ExtractUNCVolume(const Path: String): String;
|
|
begin
|
|
Result := '';
|
|
end;
|
|
|
|
function GetFileDescription(const AFilename: string): string;
|
|
var
|
|
Fn: string;
|
|
MyLock: BPTR;
|
|
Info: TFileInfoBlock;
|
|
begin
|
|
Result := '';
|
|
Fn := Utf8ToSys(AFilename);
|
|
MyLock := AmigaDos.Lock(PChar(Fn), SHARED_LOCK);
|
|
if PtrUInt(MyLock) <> 0 then
|
|
begin
|
|
Examine(MyLock, @Info);
|
|
if (Info.fib_Protection and FIBF_ARCHIVE) <> 0 then
|
|
Result := Result + 'a';
|
|
if (Info.fib_Protection and FIBF_SCRIPT) <> 0 then
|
|
Result := Result + 's';
|
|
if (Info.fib_Protection and FIBF_PURE) <> 0 then
|
|
Result := Result + 'p';
|
|
if (Info.fib_Protection and FIBF_EXECUTE) <> 0 then
|
|
Result := Result + 'e';
|
|
if (Info.fib_Protection and FIBF_READ) <> 0 then
|
|
Result := Result + 'r';
|
|
if (Info.fib_Protection and FIBF_WRITE) <> 0 then
|
|
Result := Result + 'w';
|
|
if (Info.fib_Protection and FIBF_DELETE) <> 0 then
|
|
Result := Result + 'd';
|
|
AmigaDos.UnLock(MyLock);
|
|
end;
|
|
end;
|
|
|
|
|
|
function GetAppConfigDirUTF8(Global: Boolean; Create: boolean = false): string;
|
|
begin
|
|
Result := SysToUTF8(SysUtils.GetAppConfigDir(Global));
|
|
if Result = '' then exit;
|
|
if Create and not ForceDirectoriesUTF8(Result) then
|
|
raise EInOutError.Create(SysUtils.Format(lrsUnableToCreateConfigDirectoryS,[Result]));
|
|
end;
|
|
|
|
function GetAppConfigFileUTF8(Global: Boolean; SubDir: boolean;
|
|
CreateDir: boolean): string;
|
|
var
|
|
Dir: string;
|
|
begin
|
|
Result := SysToUTF8(SysUtils.GetAppConfigFile(Global,SubDir));
|
|
if not CreateDir then exit;
|
|
Dir := ExtractFilePath(Result);
|
|
if Dir = '' then exit;
|
|
if not ForceDirectoriesUTF8(Dir) then
|
|
raise EInOutError.Create(SysUtils.Format(lrsUnableToCreateConfigDirectoryS,[Dir]));
|
|
end;
|
|
|
|
function GetShellLinkTarget(const FileName: string): string;
|
|
begin
|
|
Result := Filename;
|
|
end;
|
|
|
|
procedure InitLazFileUtils;
|
|
begin
|
|
//dummy
|
|
end;
|
|
|
|
procedure FinalizeLazFileUtils;
|
|
begin
|
|
//dummy
|
|
end;
|