Einzelnen Beitrag anzeigen

bigg
(Gast)

n/a Beiträge
 
#3

Re: INI ASCII/ANSI oder Unicode ?

  Alt 14. Apr 2007, 14:25
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;
  Mit Zitat antworten Zitat