Wenn du nur überprüfen möchtest, ob die Datei eine "normale" Text-Datei im
ANSI-Format ist, kannst du die untere Funktion verwenden. Wenn du zusätzlich noch herrausfinden möchtest, welches Format exakt vorliegt, könntest du einen Blick in die
SynUnicode.pas werfen. Dort gibt es eine Klasse namens
TWideStringList mit der man auch
Unicode verarbeiten kann.
Delphi-Quellcode:
////////////////////////////////////////////////////////////////////////////////
// Konstanten:
////////////////////////////////////////////////////////////////////////////////
const FILE_OPEN_FAILED = -2;
const FILE_NOT_FOUND = -1;
const FILE_IS_NOT_BINARY = 0;
const FILE_IS_BINARY = 1;
////////////////////////////////////////////////////////////////////////////////
// Dateien: Gibt die Größe einer Datei zurück (auch über 4 GB)
////////////////////////////////////////////////////////////////////////////////
function GetFileSize(const FileName: String): Int64;
var FileHandle: Cardinal;
Data: WIN32_FIND_DATA;
begin
Result := -1;
FileHandle := FindFirstFile(PChar(FileName), Data);
try
if FileHandle > 0 then
begin
Int64Rec(Result).Hi := Data.nFileSizeHigh;
Int64Rec(Result).Lo := Data.nFileSizeLow;
end;
finally
Windows.FindClose(FileHandle);
end;
end;
////////////////////////////////////////////////////////////////////////////////
// Dateien: Prüft, ob eine Datei binäre Zeichen enthält
////////////////////////////////////////////////////////////////////////////////
function IsBinaryFile(const FileName: String): Integer;
const MAX_BUFFER = 4096; // Clustergröße
ValidControlChars: Set of Byte = [9, 10, 12, 13]; // typische Textsteuerzeichen
var Buffer: Array[1..MAX_BUFFER] of Byte;
FilePosition, FileSize: Int64;
FileHandle, FileBlocks, LastBlock, BufferSize: Integer;
i, j: Integer;
begin
Result := FILE_IS_NOT_BINARY;
FilePosition := 0;
if FileExists(FileName) then
begin
FileHandle := FileOpen(FileName, fmOpenRead or fmShareDenyNone);
try
if FileHandle > 0 then
begin
FileSize := GetFileSize(FileName); // Dateigröße in Byte ermittln
FileBlocks := FileSize div MAX_BUFFER; // Anzahl max. Blöcke
LastBlock := FileSize mod MAX_BUFFER; // Größe des Rest-Block
// Letzten Block hinzufügen
if LastBlock <> 0 then Inc(FileBlocks);
// Blöcke einlesen
for i := 0 to FileBlocks -1 do
begin
if Result = FILE_IS_BINARY then Break;
// Aktuelle Dateiposition anpassen
FileSeek(FileHandle, FilePosition, 0);
Inc(FilePosition, MAX_BUFFER);
if FilePosition <= FileSize then
BufferSize := MAX_BUFFER else
BufferSize := LastBlock;
FileRead(FileHandle, Buffer[1], BufferSize);
for j := 1 to BufferSize do
begin
if Buffer[j] < 32 then
begin
if not (Buffer[j] in ValidControlChars) then
begin
Result := FILE_IS_BINARY;
Break;
end;
end;
end; {\for: j}
end; {\for: i}
end
else
Result := FILE_OPEN_FAILED;
finally
FileClose(FileHandle);
end;
end
else
Result := FILE_NOT_FOUND;
end;