Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wie Erkenne ich den Unterschied zwischen Unix und Win32 file (https://www.delphipraxis.net/83094-wie-erkenne-ich-den-unterschied-zwischen-unix-und-win32-file.html)

ascotlx 29. Dez 2006 09:31

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
 
da bin ich wieder :???:

@Reinhard
hast Du eine andere Lösung parat ?? oder anders gefragt, wie würde Dein Programm aussehen ??

Gruss
ascotlx

DGL-luke 29. Dez 2006 12:18

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
 
grmpf.... ok, reinhard:

Delphi-Quellcode:
function FileHasDOSLineBreak(fName: string): Boolean;
var
  c: char;
  i: Integer;
begin
  with TFileStream.Create(fName, fmOpenRead) do
  try
    c := #0;
    while Position < Size do
    begin
      Read(c,SizeOf(c));
      if c = #10 then
      begin
        Result := false;
        Break;
      end
      else if c = #13 then
      begin
        Result := true;
        Break;
      end
    end;
  finally
    Free;
  end;
end;
So zufrieden?

Reinhard Kern 29. Dez 2006 12:28

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
 
Zitat:

Zitat von ascotlx
da bin ich wieder :???:

@Reinhard
hast Du eine andere Lösung parat ?? oder anders gefragt, wie würde Dein Programm aussehen ??

Gruss
ascotlx

Hallo, habe ich schon in Nachricht 16 beschrieben:

"du must doch nur die Datei als file of char solange zeichenweise lesen, bis ein CR oder LF auftaucht: CR -> Windows, LF -> Unix. Es gibt zwar theoretische Ausnahmen wie z.B. herrenlose LFs in Windowstexten, aber für übliche Textdateien ist das 99.9 % sicher."

Eine einfache Möglichkeit:
Delphi-Quellcode:
function IsUnixText (FName : ShortString) : boolean;
var tf : file of char;
    nch : Char;
begin
AssignFile (tf,FName);
Reset (tf);
repeat
  if not Eof (tf) then read (tf,nch);
until (nch = #10) or (nch = #13) or Eof (tf);
Close (tf);
Result := nch = #10;
end;
 { ungetestet }
Gruss Reinhard

Reinhard Kern 29. Dez 2006 12:56

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
 
Zitat:

Zitat von DGL-luke
grmpf.... ok, reinhard:
...

So zufrieden?

Hallo,

Na bitte jeht doch hätte Regine Hildebrandt gesagt.

Als Strict Pascal Purist könnte man TFileStream auch noch weglassen - ich habe in der Hilfe nichts darüber gefunden, warum das besser sein soll als ein normales file of .... IO Gepuffert haben schon meine Z80-Compiler vor vielen Jahrzehnten.

Gruss Reinhard

himitsu 30. Dez 2006 11:07

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier och nochmal ein paar "uralte" Codes ... die sind zwar nicht superschnell, aber funktionieren 100%ig selbst wenn mal nicht ganz konformen CR-LF-Kombinationen.

Zum Testen:
Delphi-Quellcode:
Var D: File of Byte;
  B, Ba: Byte;
  T: Boolean;

CR := 13;  //Carriage Return
LF := 10;  //Line Feed
T := False;
AssignFile(D, Datei);
Try
  FileMode := fmOpenRead;
  Reset(D);
  Ba := 255;
  While not EoF(D) do Begin
    Read(D, B);
    If ((Ba = CR) and (B <> LF))
      or ((Ba <> CR) and (B = LF)) Then Begin
      T := False;
      Break;
    End;
    Ba := B;
  End;
  If Ba = CR Then T := False;
Except
End;
CloseFile(D);

If not T Then {mindestens ein Nicht-Windows-Zeilenumbruch ist enthalten}
Zum Umwandeln:
Delphi-Quellcode:
AssignFile(Datei1, TempDatei); Reset(Datei1);
AssignFile(Datei2, Datei); Rewrite(Datei2);
Ba := 255;
While not EoF(Datei1) do Begin
  Read(Datei1, B);
  If (Ba = CR) and (B <> LF) Then Begin Write(Datei2, LF); Ba := LF; End;
  If (Ba <> CR) and (B = LF) Then Begin Write(Datei2, CR); {Ba := CR;} End;
  Write(Datei2, B);
  Ba := B;
End;
If Ba = CR Then Write(Datei2, LF);
CloseFile(Datei2);
CloseFile(Datei1);
Aber wie schon von einigen gesagt wurde ... am Einfachsten und auch recht zuverläßig sind die TStringList-Varianten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:38 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz