Delphi-PRAXiS
Seite 3 von 4     123 4      

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)

DGL-luke 28. Dez 2006 15:02

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
 
Öhm...

Delphi-Quellcode:
function HasDOSLineBreaks(s:string):Boolean;
begin
  Result := Pos(#13#10,s) > 0;
end;
So weit wart ihr schon, oder?


Delphi-Quellcode:
procedure MakeDosLineBreaks(var s:string);
begin
  if not HasDosLineBreaks(s) then
    s := StringReplace(s,#10,#13#10,frReplaceAll);
end;
Und soweit auch?

Natürlich ist das nicht extrem fail-safe. Aber wenn klar ist, dass es reiner Text ist und entweder DOS oder Unix Linebreaks vorliegen, muss man kein Gehirn und keine Rechenkapazität und keine (potenziell verbuggten) LOC an irgendwelche Neu-Implementierungen von StringReplace verschnenden ;-)

EDIT: Aufruf auf korrekten Prototypen von StringReplace angepasst.

ascotlx 28. Dez 2006 15:41

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
 
Moin DGL-Luke,

mach ich da jetzt einen Fehler (welchen auch immer) oder funktioniert das so nicht ??

das Test Programm liefert ein "gefunden" für jedes Ergebnis von POS > 0

Delphi-Quellcode:
unit cuf1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Datei : Textfile;

implementation

{$R *.dfm}



function HasDOSLineBreaks(s:string):Boolean;
begin
  Result := Pos(#13#10,s) > 0;
end;

procedure MakeDosLineBreaks(var s:string);
begin
  if not HasDosLineBreaks(s) then
    ShowMessage('gefunden');
end;


procedure filecheck(const AFileName: String);
var fFile: file of char;
    zeile: string;
    Buffer: char;
begin
 AssignFile(Datei, AFileName);
 {$I-}Reset(Datei);{$I+}
 if IOResult=0 then
   begin
     zeile:='';
     while not eof(Datei) do
     begin
       readln(datei,zeile);
       MakeDosLineBreaks(zeile);
     end;
   end;
     CloseFile(Datei);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer ;
begin
  if OpenDialog1.Execute then
  begin
   filecheck(OpenDialog1.FileName);
  end;
end;

end.
Wenn ich eine UNIX Textdatei öffne liefert er gefunden zurück und für die DOS Textdatei genauso ...
Mit dem Pos hatte ich es schon probiert und bin genau an dieser Stelle gescheitert (Danke Christian Seehase).

Gruss

ascotlx

DGL-luke 28. Dez 2006 15:50

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

Ich konsultiere mal schnell die Delphi-Hilfe... scheint bei mir alles richtig gecodet zu sein.

Aaaaber:

Delphi-Quellcode:
procedure MakeDosLineBreaks(var s:string);
begin
  if not HasDosLineBreaks(s) then
    s := StringReplace(s,#10,#13#10,frReplaceAll);
end;
Muss das natürlich heißen.

Versuchs mal so, anstatt deiner ganzen assigngefilerei:

Delphi-Quellcode:
procedure TestAFile(fname: string);
var
  strings: TStringList;
const
  Msgs= array[false, true] of string: ('Unix-File','Linux-File');
begin
  strings := TStringList.Create;
  strings.LoadFromFile(fname);

  ShowMessage(Msgs[HasDOSLineBreaks(strings.Text)]);

  strings.Free;
end;

thkerkmann 28. Dez 2006 15:58

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
 
Hi,

haaaaalt - das hatten wir doch schon, wenn man's in die Stringlist einliest, sind die Linebreaks wieder mit CR-LF gesetzt.... oder nich ? :gruebel:

DGL-luke 28. Dez 2006 16:00

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
 
Öhm... ach so :oops:

Na dann meinetwegen mit FileStream einlesen... das Code-beispiel soll aber jemand anders schreiben, ich muss jetzt off.

Ich nehm mal an, ReadLn macht das dann genauso wie die Stringlist, weshalb immer "gefunden" rauskommt?

ascotlx 28. Dez 2006 16:05

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
 
@DGL-luke
arrrgggghhh hier ne' Korrektur ....
ALT
Delphi-Quellcode:
s := StringReplace(s,#10,#13#10,frReplaceAll);
NEU
Delphi-Quellcode:
 s := StringReplace(s,#10,#13#10,[rfReplaceAll]);
Anonsten folgende Fehler (wie gesagt, ich mach das noch nicht lange)

Zeile 44 ...

Msgs= array[false, true] of string: ('Unix-File','Linux-File');
[Fehler] cuf1.pas(44): Ausdruck erwartet, aber 'ARRAY' gefunden
[Fehler] cuf1.pas(44): ';' erwartet, aber 'OF' gefunden
[Fehler] cuf1.pas(49): Array-Typ erforderlich

trotzdem danke morgen mehr ich hab' n' Termin ... bis dann

Zudem muss ich thkerkmann recht geben oder ???

gruss

ascotlx

thkerkmann 28. Dez 2006 16:09

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

Zitat von ascotlx

Anonsten folgende Fehler (wie gesagt, ich mach das noch nicht lange)

Zeile 44 ...

Msgs= array[false, true] of string: ('Unix-File','Linux-File');
[Fehler] cuf1.pas(44): Ausdruck erwartet, aber 'ARRAY' gefunden
[Fehler] cuf1.pas(44): ';' erwartet, aber 'OF' gefunden
[Fehler] cuf1.pas(49): Array-Typ erforderlich

trotzdem danke morgen mehr ich hab' n' Termin ... bis dann

Zudem muss ich thkerkmann recht geben oder ???

gruss

ascotlx

:-) Danke

Delphi-Quellcode:
Msgs : array[false, true] of string = (...)
Vorne Doppelpunkt, hinten Gleichheitszeichen.

:-D

ascotlx 28. Dez 2006 16:17

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin ...

hab das jetzt so gelöst ... gerade getestet.
Es ist nicht sehr schön und Verbesserungen werden dankbar angebommen.

Delphi-Quellcode:
unit cuf1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Datei : Textfile;

implementation

{$R *.dfm}


procedure filecheck(const AFileName: String);
var fFile: file of char;
    zeile: string;
    Buffer: char;
begin
 AssignFile(Datei, AFileName);
 {$I-}Reset(Datei);{$I+}
 if IOResult=0 then
   begin
     zeile:='';
     while not eof(Datei) do
     begin
       Read(Datei, Buffer);
       if Buffer = #$0D then
         begin
           Read(Datei, Buffer);
             if Buffer = #$0A then
               begin
                 ShowMessage('DOS Datei');
                 break;
               end
         end;
     end;
   end;
     CloseFile(Datei);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer ;
begin
  if OpenDialog1.Execute then
  begin
    filecheck(OpenDialog1.FileName);
  end;
end;

end.
Hier die 2 Dateien mit denen ich getestet habe.



Gruss

ascotlx

marabu 28. Dez 2006 17:03

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
 
Hi,

mir reicht in der Regel das hier:

Delphi-Quellcode:
function CheapDosText(fn: TFileName): Boolean;
var
  sEoln: String[2];
begin
  with TFileStream.Create(fn, fmOpenRead or fmShareDenyWrite) do
  try
    if Size > 1 then
    begin
      Position := Size - 2;
      ReadBuffer(sEoln[1], 2);
      SetLength(sEoln, 2);
      Result := sEoln = sLineBreak;
    end else Result := False;
  finally
    Free;
  end;
end;
Wird True geliefert, dann ist das Ergebnis sicher. Bei False kann es sein, dass die letzte Textzeile nicht terminiert wurde, dann muss man mehr Aufwand treiben.

Freundliche Grüße

Reinhard Kern 28. Dez 2006 23:48

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

Zitat von DGL-luke
:gruebel:

Ich konsultiere mal schnell die Delphi-Hilfe... scheint bei mir alles richtig gecodet zu sein.

...
Versuchs mal so, anstatt deiner ganzen assigngefilerei:

Delphi-Quellcode:
procedure TestAFile(fname: string);
var
  strings: TStringList;
const
  Msgs= array[false, true] of string: ('Unix-File','Linux-File');
begin
  strings := TStringList.Create;
  strings.LoadFromFile(fname);

  ShowMessage(Msgs[HasDOSLineBreaks(strings.Text)]);

  strings.Free;
end;

Hallo Luke,

es ist in diesem Forum offensichtlich Mehrheitsmeinung, man müsste jede Datei erst mal komplett in den Speicher lesen, bevor man sich überhaupt Gedanken macht, was damit zu tun wäre. Ich werde mich aber bis an mein Lebensende dagegen wehren, das als intelligent zu betrachten. Meinetwegen haltet mich für einen Dinosaurier.

Im vorliegenden Fall ist meiner Meinung nach jede Lösung, die weiter liest als bis zum ersten Zeilenende, zwar möglicherweise korrekt, aber dumm.

Gruss Reinhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:49 Uhr.
Seite 3 von 4     123 4      

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