mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-06 15:52:46 +02:00
284 lines
7.2 KiB
PHP
284 lines
7.2 KiB
PHP
{%MainUnit lazfileutils.pas}
|
|
|
|
function FilenameIsAbsolute(const TheFilename: string):boolean;
|
|
begin
|
|
Result:=FilenameIsUnixAbsolute(TheFilename);
|
|
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
|
|
st: baseunix.stat;
|
|
SysFileName: String;
|
|
begin
|
|
SysFileName := Utf8ToSys(FileName);
|
|
if not fpstat(pointer(SysFileName),st{%H-})>=0 then
|
|
exit(-1);
|
|
Result := st.st_size;
|
|
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;
|
|
|
|
procedure FindCloseUTF8(var F: TSearchrec);
|
|
begin
|
|
SysUtils.FindClose(F);
|
|
end;
|
|
|
|
function ExpandFileNameUtf8(const FileName: string; {const} BaseDir: String = ''): String;
|
|
var
|
|
IsAbs: Boolean;
|
|
CurDir, HomeDir, Fn: String;
|
|
begin
|
|
Fn := FileName;
|
|
DoDirSeparators(Fn);
|
|
IsAbs := FileNameIsUnixAbsolute(Fn);
|
|
if (not IsAbs) then
|
|
begin
|
|
CurDir := GetCurrentDirUtf8;
|
|
if ((Length(Fn) > 1) and (Fn[1] = '~') and (Fn[2] = '/')) or (Fn = '~') then
|
|
begin
|
|
{$Hint use GetEnvironmentVariableUTF8}
|
|
HomeDir := SysToUtf8(GetEnvironmentVariable('HOME'));
|
|
if not FileNameIsUnixAbsolute(HomeDir) then
|
|
HomeDir := ExpandFileNameUtf8(HomeDir,'');
|
|
Fn := HomeDir + Copy(Fn,2,length(Fn));
|
|
IsAbs := True;
|
|
end;
|
|
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 FileNameIsUnixAbsolute(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
|
|
Info : Stat;
|
|
begin
|
|
// first check AFilename is not a directory and then check if executable
|
|
Result:= (FpStat(AFilename,info{%H-})<>-1) and FPS_ISREG(info.st_mode) and
|
|
(BaseUnix.FpAccess(AFilename,BaseUnix.X_OK)=0);
|
|
end;
|
|
|
|
procedure CheckIfFileIsExecutable(const AFilename: string);
|
|
var
|
|
AText: 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(Format(lrsFileDoesNotExist, [AFilename]));
|
|
end;
|
|
if DirPathExists(AFilename) then begin
|
|
raise Exception.Create(Format(lrsFileIsADirectoryAndNotAnExecutable, [
|
|
AFilename]));
|
|
end;
|
|
if BaseUnix.FpAccess(AFilename,BaseUnix.X_OK)<>0 then
|
|
begin
|
|
AText:='"'+AFilename+'"';
|
|
case fpGetErrno() of
|
|
ESysEAcces:
|
|
AText:=Format(lrsReadAccessDeniedFor, [AText]);
|
|
ESysENoEnt:
|
|
AText:=Format(lrsADirectoryComponentInDoesNotExistOrIsADanglingSyml, [
|
|
AText]);
|
|
ESysENotDir:
|
|
AText:=Format(lrsADirectoryComponentInIsNotADirectory, [Atext]);
|
|
ESysENoMem:
|
|
AText:=lrsInsufficientMemory;
|
|
ESysELoop:
|
|
AText:=Format(lrsHasACircularSymbolicLink, [AText]);
|
|
else
|
|
AText:=Format(lrsIsNotExecutable, [AText]);
|
|
end;
|
|
raise Exception.Create(AText);
|
|
end;
|
|
// ToDo: xxxbsd
|
|
end;
|
|
|
|
function FileIsSymlink(const AFilename: string): boolean;
|
|
begin
|
|
Result := FpReadLink(AFilename) <> '';
|
|
end;
|
|
|
|
procedure CheckIfFileIsSymlink(const AFilename: string);
|
|
var
|
|
AText: string;
|
|
begin
|
|
// to get good error messages consider the OS
|
|
if not FileExistsUTF8(AFilename) then begin
|
|
raise Exception.Create(Format(lrsFileDoesNotExist, [AFilename]));
|
|
end;
|
|
if FpReadLink(AFilename)='' then begin
|
|
AText:='"'+AFilename+'"';
|
|
case fpGetErrno() of
|
|
ESysEAcces:
|
|
AText:=Format(lrsReadAccessDeniedFor, [AText]);
|
|
ESysENoEnt:
|
|
AText:=Format(lrsADirectoryComponentInDoesNotExistOrIsADanglingSyml2, [
|
|
AText]);
|
|
ESysENotDir:
|
|
AText:=Format(lrsADirectoryComponentInIsNotADirectory2, [Atext]);
|
|
ESysENoMem:
|
|
AText:=lrsInsufficientMemory;
|
|
ESysELoop:
|
|
AText:=Format(lrsHasACircularSymbolicLink, [AText]);
|
|
else
|
|
AText:=Format(lrsIsNotASymbolicLink, [AText]);
|
|
end;
|
|
raise Exception.Create(AText);
|
|
end;
|
|
end;
|
|
|
|
function FileIsHardLink(const AFilename: string): boolean;
|
|
var
|
|
H: THandle;
|
|
FileInfo: stat;
|
|
begin
|
|
Result := false;
|
|
H := FileOpenUtf8(aFilename, fmOpenRead);
|
|
if H <> feInvalidHandle then
|
|
begin
|
|
if FPFStat(H, FileInfo{%H-}) = 0 then
|
|
Result := (FileInfo.st_nlink > 1);
|
|
FileClose(H);
|
|
end;
|
|
end;
|
|
|
|
function FileIsReadable(const AFilename: string): boolean;
|
|
begin
|
|
Result:= BaseUnix.FpAccess(AFilename,BaseUnix.R_OK)=0;
|
|
end;
|
|
|
|
function FileIsWritable(const AFilename: string): boolean;
|
|
begin
|
|
Result := (BaseUnix.FpAccess(AFilename, BaseUnix.W_OK) = 0);
|
|
end;
|
|
|
|
|
|
function IsUNCPath(const Path: String): Boolean;
|
|
begin
|
|
Result := false;
|
|
end;
|
|
|
|
function ExtractUNCVolume(const Path: String): String;
|
|
begin
|
|
Result := '';
|
|
end;
|
|
|
|
|
|
|
|
procedure InitLazFileUtils;
|
|
begin
|
|
//dummy
|
|
end;
|