Hallo!
Ich will ja die LibC in allen Projekten loswerden. Nur finde ich leider kein Äquivalent zu TStatBuf in anderen Units. Kennt jemand eines?
TStatBuf aus LibC ersetzen
Re: TStatBuf aus LibC ersetzen
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;
-
- 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
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.
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.
Re: TStatBuf aus LibC ersetzen
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
-
- 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
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 )
P.S: Dieses TStat soll ja Informationen über das Dateisystem zurückgeben. Aber was ist dann TStatBuf64 gewesen?
P.S: Dieses TStat soll ja Informationen über das Dateisystem zurückgeben. Aber was ist dann TStatBuf64 gewesen?
-
- 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
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.
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.