AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Wie Erkenne ich den Unterschied zwischen Unix und Win32 file
Thema durchsuchen
Ansicht
Themen-Optionen

Wie Erkenne ich den Unterschied zwischen Unix und Win32 file

Ein Thema von Corpsman · begonnen am 27. Dez 2006 · letzter Beitrag vom 30. Dez 2006
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#21

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32

  Alt 28. Dez 2006, 16:02
Ö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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von ascotlx
ascotlx

Registriert seit: 8. Mär 2005
Ort: Hamburg
97 Beiträge
 
Delphi 7 Professional
 
#22

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32

  Alt 28. Dez 2006, 16:41
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
workarounds gibt es wie Sand am Meer und manchmal hat man ein workaround ohne es zu wissen
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#23

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32

  Alt 28. Dez 2006, 16:50


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;
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#24

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32

  Alt 28. Dez 2006, 16:58
Hi,

haaaaalt - das hatten wir doch schon, wenn man's in die Stringlist einliest, sind die Linebreaks wieder mit CR-LF gesetzt.... oder nich ?
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#25

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32

  Alt 28. Dez 2006, 17:00
Öhm... ach so

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?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von ascotlx
ascotlx

Registriert seit: 8. Mär 2005
Ort: Hamburg
97 Beiträge
 
Delphi 7 Professional
 
#26

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32

  Alt 28. Dez 2006, 17:05
@DGL-luke
arrrgggghhh hier ne' Korrektur ....
ALT
s := StringReplace(s,#10,#13#10,frReplaceAll); NEU
 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
workarounds gibt es wie Sand am Meer und manchmal hat man ein workaround ohne es zu wissen
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#27

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32

  Alt 28. Dez 2006, 17:09
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

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

Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Benutzerbild von ascotlx
ascotlx

Registriert seit: 8. Mär 2005
Ort: Hamburg
97 Beiträge
 
Delphi 7 Professional
 
#28

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32

  Alt 28. Dez 2006, 17:17
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
Angehängte Dateien
Dateityp: zip unix_win32_123.zip (414 Bytes, 1x aufgerufen)
workarounds gibt es wie Sand am Meer und manchmal hat man ein workaround ohne es zu wissen
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#29

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32

  Alt 28. Dez 2006, 18:03
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
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#30

Re: Wie Erkenne ich den Unterschied zwischen Unix und Win32

  Alt 29. Dez 2006, 00:48
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz