IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Двоичные и текстовые фалы... (Для Delpher'ов) (https://www.imho.ws/showthread.php?t=43893)

f00rd 20.11.2003 19:35

Двоичные и текстовые фалы... (Для Delpher'ов)
 
Народ, подскажите, как определить на Delphi какой файл, текстовый или двоичный?

SpacerV 20.11.2003 20:07

f00rd
Если я правильно понял вопрос, то вот такой есть вариант: анализировать файл побайтно до тех пор, пока не найдется один из символов #0..#8, #11..#12, #14..#31. Если символ с таким кодом найден, то файл двоичный, иначе - текстовый.
Если этот вариант тебе подходит и нужна реализация его на Делфи - напиши.

ImitatoR 21.11.2003 05:10

00h - верный признак бинарника :)

2SpacerV: Коды от 20h до 7Eh - это символы us-ascii, а ты написал #14..#31 - признак двоичного файла...

f00rd 21.11.2003 13:48

SpacerV
Цитата:

Если этот вариант тебе подходит и нужна реализация его на Делфи
Напижи, если можно, на мыло: vitaliksite@mail.ru

SpacerV 21.11.2003 15:51

ImitatoR
Числа 14..31 (0Eh..1Fh) не попадают в диапазон 32..126 (20h..7Eh).

Добавлено через 48 минут:
f00rd
Прока не длинная, так что помещаю на форуме:

Код:

function IsFileBinary(const FileName: string): boolean;
const
  BUF_SIZE = 4096;
var
  TargetFile: TFileStream;
  FileBuffer: array [0..BUF_SIZE-1] of byte;
  FileSize, BufSize, I: integer;
begin
  Result:=False;
  try
    TargetFile:=TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  except
    on E: Exception do
      raise Exception.CreateFmt('Не удалось открыть файл. '+
        'Дополнительная информация: "%s"', [E.Message]);
  end;
  FileSize:=TargetFile.Size;
  while TargetFile.Position<FileSize do
  begin
    BufSize:=TargetFile.Read(FileBuffer, BUF_SIZE);
    for I:=0 to BufSize-1 do
      case FileBuffer[I] of
        0..8, 11..12, 14..31, 255:
        { Для понимания текстовых файлов, созданных в старых редакторах,
          прийдется заменить пред. строку на:
        0..8, 14..25, 27..31, 255:}
        begin
          Result:=True;
          TargetFile.Free;
          Exit;
        end;
      end;
  end;
  TargetFile.Free;
end;


CEO 21.11.2003 16:43

Вложений: 1
f00rd :Вот кстати и небольшая докементация по бинарному формату, для полной ясности.

ImitatoR 22.11.2003 20:36

Цитата:

SpacerV:
Числа 14..31 (0Eh..1Fh) не попадают в диапазон 32..126 (20h..7Eh).
Вижу :) Попутал спросонок # с $ :biggrin:


Часовой пояс GMT +4, время: 15:54.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.