Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Textfile als solches erkennen (https://www.delphipraxis.net/139565-textfile-als-solches-erkennen.html)

martinf16 31. Aug 2009 21:01


Textfile als solches erkennen
 
Hallo,

ich möchte unabhängig von der Endung der Datei erkennen, ob es sich um ein Textfile erkennt. Schließlich kann ein Textfile jede Menge Endungen haben (txt, htm, php...). Gibt es dafür eine bestimmte Funktion oder kann man die ersten Bytes auslesen und daran etwas prüfen?! Und wenn ja, wie macht man das?!

Vielen Dank schon mal!

himitsu 31. Aug 2009 21:07

Re: Textfile als solches erkennen
 
Es ist nicht eindeutig erkennbar.

Du kannst höchstens versuchen nach gewissen Zeichen zu suchen,
aber dafür mußt du wissen, welche Kodierungen du zulassen willst.

bei ASCII z.B. gibt es keine Zeichen über #127

UTF-8 hat oftmals eine entsprechende BOM und alle Zeichen über #127 entsprechen gewissen Mustern

unterhalb der #32 gibt es oftmals nur die Zeichen #13, #10 (Zeilenumbruch) und #8 (Tabulator)

aber dennoch können je nach Textformat alle möglichen Zeichen drin vorkommen.

jfheins 31. Aug 2009 21:08

Re: Textfile als solches erkennen
 
Du wirst die Datei einfach mal öffnen müssen und durchsuchen ;)

Wenn viele Alphanumerischen Zeichen und #13#10 vorkommen, isses wahrscheinlich Text, wenn viele nicht-Text Zeichen vorkommen ehe binär.

Um das zu realisieren könntest du son Array machen, das jedem ASCII-Zeichen einen Wert zuordnet: z.B. 0 für neutral, 1 für ein Textzeichen und -100 für Zeichen, die garantiert nicht in Text vorkommen ;)

Achja, BOM's am Anfang sindauch ein Indikator ;)

martinf16 31. Aug 2009 21:40

Re: Textfile als solches erkennen
 
Was sind denn BOMs am Anfang?!

ASCII würde mir erst einmal reichen und die Prüfung muss auch nicht so genau sein, dass sie jedes Zeichen einzeln prüft. Es sollte nur ein ungefährer Richtwert sein. Also vielleicht eine Prüfung der ersten Zeichen? Aber wie kann die aussehen?

jfheins 31. Aug 2009 21:50

Re: Textfile als solches erkennen
 
http://de.wikipedia.org/wiki/Byte_Order_Mark ;)

Wie gesagt, ordne jedem Zeichen einen Wert zu, der angibt ob es sich wahrscheinlich um Binär oder um Text handelt. Gehe dann duch die ersten 1000 oder so Zeichen und vergleiche danach den erhaltenen Wert mit einem Grenzwert.

Luckie 31. Aug 2009 21:52

Re: Textfile als solches erkennen
 
Zur problematik und BOM:
Some files come up strange in Notepad
The Notepad file encoding problem, redux

martinf16 31. Aug 2009 22:11

Re: Textfile als solches erkennen
 
Okay, wenn ich die Links jetzt richtig interpretiere heißt das, dass die normalen Textfiles, die ich prüfen möchte eigentlich gar nicht prüfbar sind, da sie kein BOM enthalten, stimmts?

Ich habe mir mal folgende Function gebastelt:

Delphi-Quellcode:
function CheckTextfile(Datei : string): boolean;
var
  F: File;
  DateiAnfang: Array [0..100] of Byte;
  I: Integer;
begin
  try
    AssignFile(F, Datei;
    Reset(F, 1);
    Blockread(F, DateiAnfang, SizeOf(DateiAnfang));
  finally
    CloseFile(F);
  end;

  for I := 0 to 100 do
    if DateiAnfang[I] //wie kann man hier weitermachen?!

end;

Luckie 1. Sep 2009 02:17

Re: Textfile als solches erkennen
 
Zitat:

Zitat von martinf16
Okay, wenn ich die Links jetzt richtig interpretiere heißt das, dass die normalen Textfiles, die ich prüfen möchte eigentlich gar nicht prüfbar sind, da sie kein BOM enthalten, stimmts?

Fast. In den Links geht es darum, dass Textdatei nicht gleich Textdatei ist, da sie unterschiedlich kodiert sein können. Das hat nur am Rande mit der BOM zu tun.


Zitat:

Delphi-Quellcode:
if DateiAnfang[I] //wie kann man hier weitermachen?!

Gar nicht. Lies dir noch mal die Links durch. Insbesondere das:
Zitat:

Here's the file "Hello" in various encodings:

48 65 6C 6C 6F

This is the traditional ANSI encoding.
48 00 65 00 6C 00 6C 00 6F 00

This is the Unicode (little-endian) encoding with no BOM.
FF FE 48 00 65 00 6C 00 6C 00 6F 00

This is the Unicode (little-endian) encoding with BOM. The BOM (FF FE) serves two purposes: First, it tags the file as a Unicode document, and second, the order in which the two bytes appear indicate that the file is little-endian.
00 48 00 65 00 6C 00 6C 00 6F

This is the Unicode (big-endian) encoding with no BOM. Notepad does not support this encoding.
FE FF 00 48 00 65 00 6C 00 6C 00 6F

This is the Unicode (big-endian) encoding with BOM. Notice that this BOM is in the opposite order from the little-endian BOM.
EF BB BF 48 65 6C 6C 6F

This is UTF-8 encoding. The first three bytes are the UTF-8 encoding of the BOM.
2B 2F 76 38 2D 48 65 6C 6C 6F

This is UTF-7 encoding. The first five bytes are the UTF-7 encoding of the BOM. Notepad doesn't support this encoding.

EWeiss 1. Sep 2009 03:26

Re: Textfile als solches erkennen
 
Das sind auch die probleme unter Windows das viel unfug mit den Dateien getrieben wird.
Warum kann man die Extension nicht generell entfernen und nur noch die Datei anhand eines Header erkennen lassen.
Bei AVI und anderen Dateien gehts ja auch warum nicht bei Text ? (.txt).

Eine *.chm Datei kann und wird deshalb auch als ausführbare EXE (Virus, trojaner) verwendet.

gruss

himitsu 1. Sep 2009 05:56

Re: Textfile als solches erkennen
 
Zitat:

This is the traditional ANSI encoding.
48 00 65 00 6C 00 6C 00 6F 00
da stimmt aber irgendwas nicht

also 2 Byte-Zeichen und 1-Byte-Ansi

Lannes 1. Sep 2009 07:48

Re: Textfile als solches erkennen
 
Hallo,

bin ich auch erst drauf reingefallen :wink: lies es mal in einer anderen Reihenfolge.

jfheins 1. Sep 2009 07:50

Re: Textfile als solches erkennen
 
Zitat:

Zitat von himitsu
Zitat:

This is the traditional ANSI encoding.
48 00 65 00 6C 00 6C 00 6F 00
da stimmt aber irgendwas nicht

also 2 Byte-Zeichen und 1-Byte-Ansi

Copy & Waste: Die Leerzeilen trennen falsch - der Text gehört immer zu den Hex-Zeichen darüber ;)

Also nochmal für himi :mrgreen:
Zitat:

48 65 6C 6C 6F
This is the traditional ANSI encoding.

48 00 65 00 6C 00 6C 00 6F 00
This is the Unicode (little-endian) encoding with no BOM.

himitsu 1. Sep 2009 08:09

Re: Textfile als solches erkennen
 
arg :wall:

Luckie 1. Sep 2009 13:21

Re: Textfile als solches erkennen
 
Zitat:

Zitat von EWeiss
Warum kann man die Extension nicht generell entfernen und nur noch die Datei anhand eines Header erkennen lassen.

Das ist wahrscheinlich historisch bedingt und man könnte jetzt wohl nur schwer was ändern, wegen der Abwärtskompatibilität.

himitsu 1. Sep 2009 13:32

Re: Textfile als solches erkennen
 
ohne die ganzen Explorer-Plugins, welche meißt sinnlose zusätliche Infos aus den Dateien auslesen,
wäre das Auflisten der Windows-Verzeichnisse schneller, da man nich erst in jede Datei reingucken muß, um welchen Typ es sich handelt.

Geht eigentlich unter Linux etwas wie FindFirst(*.txt) ?
Also wenn da der Typ in der Datei drinsteht und nicht als Namensanhang vorhanden ist.

Luckie 1. Sep 2009 13:40

Re: Textfile als solches erkennen
 
Wenn unter Linux der Dateityp am Anfang der Datei steht, dann musst du nur eine unter Linux erstellte Textdatei unter Windows öffnen und würdest es sehen. Damit wären aber Linux Textdatei inkompatibel zum Rest der Welt und das glaube ich nicht. Deswegen glaube ich eher, dass wenn Linux den Dateityp speichert, dies im Dateisystem tut. Und dann müsste dies auch das Programm machen, welches die Datei erstellt.

DeddyH 1. Sep 2009 13:41

Re: Textfile als solches erkennen
 
http://linux.about.com/library/cmd/blcmdl1_file.htm

Luckie 1. Sep 2009 13:45

Re: Textfile als solches erkennen
 
Also auch nur Tests mit try and error.

martinf16 3. Sep 2009 01:27

Re: Textfile als solches erkennen
 
Ich habe jetzt folgendes gefunden:

http://www.swissdelphicenter.ch/de/showcode.php?id=1776

Bewirkt zwar auch keine Wunder, aber vielleicht hilfts jemandem weiter.

Luckie 3. Sep 2009 01:30

Re: Textfile als solches erkennen
 
Auch nicht besser als alles andere, was bisher vorgeschlagen wurde.

martinf16 3. Sep 2009 01:33

Re: Textfile als solches erkennen
 
Zumal auch noch folgendes Problem besteht (für alle die die Funktion verwenden wollen und sich nicht so gut auskennen):

Der Code beschränkt sich nur auf die ersten 127 Zeichen, demnach würde selbst ein Textfile mit deutschen Umlauten nicht als solcher erkannt werden.. Man müsste also wenn dies nicht geschehen soll die 127 auf eine 255 abändern.

martinf16 3. Sep 2009 01:53

Re: Textfile als solches erkennen
 
Was ist denn davon zu halten?

http://www.swissdelphicenter.ch/de/showcode.php?id=245

himitsu 3. Sep 2009 06:45

Re: Textfile als solches erkennen
 
Zitat:

Zitat von martinf16

abgesehn, daß diese isAscii falsch arbeitet (die Zeichen #128..#255 sind keine ASCII-Zeichen und werden dort ganz ignoriert ... ASCII = 7 Bit)

alzaimar 3. Sep 2009 07:02

Re: Textfile als solches erkennen
 
Nun ja, heutzutage ist ASCII eher als 'lesbar mit Notepad' zu verstehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:05 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