Hallo!
Ich möchte testen, ob eine Datei eine "Binärdatei" oder eine "Textdatei" ist. (Ich bin mir der Problematik dieser Unterscheidung bewusst). Dazu teste ich, ob in den ersten n Bytes dieser Datei Indikatoren für eine Binärdatei enthalten sind:
EDIT 10.5.2015:
Besser wäre diese Formulierung: Ich möchte testen, ob eine Datei keine "Binärdatei" ist (d.h. mit möglichst hoher Wahrscheinlichkeit bei vertretbarem Aufwand ausschließen, dass es eine Binärdatei ist). Deswegen wäre ein besserer Name für die Funktion: IsNotBinaryFile. Aber das würde ggf. zu einer doppelten Verneinung im Code führen ("if not IsNotBinaryFile"), was wiederum unnötig umständlich wäre; deshalb belasse ich es bei "IsTextFile".
Delphi-Quellcode:
function IsTextFile(
const AFile:
string;
const ABytesCount: Integer = 1000): Boolean;
// testet, ob die ersten ABytesCount Bytes einer Datei Indikatoren für eine Binär-Datei enthalten:
// wenn nicht, muss es wohl eine Textdatei sein?
// Siehe auch: http://qc.embarcadero.com/wc/qcmain.aspx?d=84071
var
Reader: TStreamReader;
Ch: AnsiChar;
c: Integer;
begin
Result := True;
c := 0;
Reader := TStreamReader.Create(TFileStream.Create(AFile, fmOpenRead), TEncoding.ANSI);
try
if Reader.EndOfStream
then
begin
CodeSite.Send('
Nothing to read');
Result := False;
EXIT;
end;
while Reader.Peek() >= 0
do
begin
Ch := AnsiChar(Reader.
Read());
if Ch = #0
then
begin
CodeSite.Send('
Null Byte found');
Result := False;
EXIT;
end;
// Todo: andere Indikatoren?
Inc(c);
if c > ABytesCount
then EXIT;
end;
finally
CodeSite.Send('
Bytes read', c);
Reader.Close();
Reader.BaseStream.Free;
Reader.Free();
end;
end;
procedure TForm1.btnTestClick(Sender: TObject);
var
d: Int64;
begin
d := GetTickCount;
CodeSite.Send('
Is Text File?', IsTextFile(edt1.Text));
CodeSite.Send('
Duration', GetTickCount - d);
end;
Welche anderen Indikatoren könnte man verwenden?