![]() |
Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
Öhm...
Delphi-Quellcode:
So weit wart ihr schon, oder?
function HasDOSLineBreaks(s:string):Boolean;
begin Result := Pos(#13#10,s) > 0; end;
Delphi-Quellcode:
Und soweit auch?
procedure MakeDosLineBreaks(var s:string);
begin if not HasDosLineBreaks(s) then s := StringReplace(s,#10,#13#10,frReplaceAll); end; 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. |
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:
Wenn ich eine UNIX Textdatei öffne liefert er gefunden zurück und für die DOS Textdatei genauso ...
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. Mit dem Pos hatte ich es schon probiert und bin genau an dieser Stelle gescheitert (Danke Christian Seehase). Gruss ascotlx |
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:
Muss das natürlich heißen.
procedure MakeDosLineBreaks(var s:string);
begin if not HasDosLineBreaks(s) then s := StringReplace(s,#10,#13#10,frReplaceAll); end; 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; |
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: |
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? |
Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
@DGL-luke
arrrgggghhh hier ne' Korrektur .... ALT
Delphi-Quellcode:
NEU
s := StringReplace(s,#10,#13#10,frReplaceAll);
Delphi-Quellcode:
Anonsten folgende Fehler (wie gesagt, ich mach das noch nicht lange)
s := StringReplace(s,#10,#13#10,[rfReplaceAll]);
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 |
Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
Zitat:
Delphi-Quellcode:
Vorne Doppelpunkt, hinten Gleichheitszeichen.
Msgs : array[false, true] of string = (...)
:-D |
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:
Hier die 2 Dateien mit denen ich getestet habe.
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. Gruss ascotlx |
Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
Hi,
mir reicht in der Regel das hier:
Delphi-Quellcode:
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.
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; Freundliche Grüße |
Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32
Zitat:
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. |
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