TStatBuf aus LibC ersetzen

Antworten
Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

TStatBuf aus LibC ersetzen

Beitrag von Targion »

Hallo!
Ich will ja die LibC in allen Projekten loswerden. Nur finde ich leider kein Äquivalent zu TStatBuf in anderen Units. Kennt jemand eines?

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TStatBuf aus LibC ersetzen

Beitrag von theo »

Targion hat geschrieben:Hallo!
Ich will ja die LibC in allen Projekten loswerden. Nur finde ich leider kein Äquivalent zu TStatBuf in anderen Units. Kennt jemand eines?


Ich hab's so ersetzt:

Code: Alles auswählen

function AbDirectoryExists( const Path : string ) : Boolean;
{$IFDEF MSWINDOWS}
var
  Attr : DWORD;
  PathZ: array [0..255] of AnsiChar;
{$ENDIF}
{$IFDEF LINUX}
var
  SB: TStat;
{$ENDIF}
 
begin
  Result := False;
  {we don't support wildcards}
  if (Pos('*', Path) <> 0) or (Pos('?', Path) <> 0) then
    Exit;
{$IFDEF MSWINDOWS}
  Attr := GetFileAttributes( StrPCopy( PathZ, Path ) );
  if (Attr <> DWORD(-1)) and ((Attr and faDirectory) <> 0) then
    Result := true;
{$ENDIF}
{$IFDEF LINUX}
  if FileExists(Path) then begin
    FPstat(PAnsiChar(Path), SB);
    Result := (SB.st_mode and AB_FMODE_DIR) = AB_FMODE_DIR;
  end;
{$ENDIF}
end;

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: TStatBuf aus LibC ersetzen

Beitrag von Targion »

Vielen Dank! Und wie hast du TStatBuf64 übersetzt?
EDIT: Lässt sich auch mit TStat ersetzen. Allerdings weis ich nicht, was diese Änderung bewirkt, da ich keinen Eintrag zu TStatBuf64 in der Freepascal-Doku finden konnte.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TStatBuf aus LibC ersetzen

Beitrag von theo »

Targion hat geschrieben:Vielen Dank! Und wie hast du TStatBuf64 übersetzt?
EDIT: Lässt sich auch mit TStat ersetzen. Allerdings weis ich nicht, was diese Änderung bewirkt, da ich keinen Eintrag zu TStatBuf64 in der Freepascal-Doku finden konnte.


Dort hab ich den ganzen Krempel mit einer anderen Lösung (FindFirst) ersetzt:

Code: Alles auswählen

function AbFileGetSize(const aFileName : string) : Int64;   //theo
var
  SR : TSearchRec;
begin
  Result := -1;
  if FindFirst(aFileName, faAnyFile, SR) = 0 then begin     
    Result:=SR.Size;
    FindClose(SR);
  end;
end;


P.S. sag doch gleich, dass du meine Lösung haben willst, statt hier alles stückweise rüberzuschieben :-)

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: TStatBuf aus LibC ersetzen

Beitrag von Targion »

Ich hatte ja alles schon selber übersetzt und das lief auch - Dachte ich. Kaum sind die ppus gelöscht Funktionierte das Entpacken nicht mehr. (der Rest aber doch) Also: Alles wieder Rückgängig und neu überarbeitet. Läuft so jetzt, danke! Vielleicht sollte man die geänderte Komponente wirklich mal hier im Forum veröffentlichen?! Sobald ich sicher bin, dass das bei mir stabil läuft mache ich das mal. (oder du :roll: )
P.S: Dieses TStat soll ja Informationen über das Dateisystem zurückgeben. Aber was ist dann TStatBuf64 gewesen?

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: TStatBuf aus LibC ersetzen

Beitrag von marcov »

DIe -64 Versionen waren (sind?) fuer 64-bits off_t gemeint. Das heisst das die aeltere nur fuer 32-bits (also bis 4GB) Files ausgelegt waren.

Also unter Linux/x86
- die 64-bits calls haben ein 64-bits typ fuer filepointer (seek() varianten) und filesizes usw
- die 32-bits calls haben ein 32-bits typ fuer filepointer (seek() varianten) und filesizes usw. 4GB grenze!
- die calls ohne -32 oder -64 (also "fstat") sind Aliase fuer eine oder der andere. Im Anfang fuer 32-bit (32-bit default), spaeter fuer 64-bit. Oft Macro's die man bevor Including mit #DEFINE aenderen kann.

Aber das Problem ist dass Borland das mit Kylix nicht versucht hat zu abstrahieren, so Borland hat das alles Buchstäblich uebersetzt in unit libc, und etwas was nur fuer Übertritt war, war auf einmal "Kylix api", und machte alle Kylix basierte code linux/x86 specifisch. Weil die BSDs hatten diese Übergang schon frueher gemacht. (FreeBSD mit -4), und die neuren Architecturen fuer Linux hatten nicht einmal sich mit 32-bits offset bemuht, und waren meistens gleich mit 64-bit angefangen.

Dies ist einer der Grunde (aber es gibt mehr), weshalb "unit libc" deprecated ist in FPC.

Antworten