Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.15;
Скачать: CL | DM;

Вниз

Как определить что это zip или rar файл по заголовку?   Найти похожие ветки 

 
Filat ©   (2002-08-01 20:35) [0]

Привет ALL!
Возникла проблема, надо по заголовку (до работы с файлом) определить, какой файл лежит в каталоге. Как это сделать?
Когда то видел в форумах, но не могу найти :(((

P.S. Идея - избежать запуска файлов с вирусами, т.е. *.pif.zip или *.*.rar и т.д. Поможет ли?


 
Anatoly Podgoretsky ©   (2002-08-01 21:19) [1]

Глазами


 
Filat ©   (2002-08-01 21:39) [2]

Anatoly Podgoretsky - это понятно, но прога будет работать в автомате и круглые сутки.

А если серьёзно? Как определить какой файл по его заголовку?


 
Anatoly Podgoretsky ©   (2002-08-01 22:25) [3]

Вот если еще расскажешь насчет заголовка


 
Almaz ©   (2002-08-02 02:36) [4]

Первые четыре байта RAR архива содержат сигнатуру "Rar!" ($52617221)
Первые 2 байта ZIP архива содержат сигнатуру "PK" ($504b)

Удачи.


 
Filat ©   (2002-08-02 13:52) [5]

Спасибо, но как это дело применить?

И ещё, если не трудно, дайте ссылочку, чтобы почитать описания сигнатур по другим форматам.


 
Anatoly Podgoretsky ©   (2002-08-02 13:59) [6]

Так ты про сигнатуры спрашивал, почитать это врядли случайные источники, зато можешь сам попытаться составить список сигнатур, путем визуального просмотра первых байт файлов соответствующих архивов.


 
Skier ©   (2002-08-02 14:34) [7]

>Filat

>
> но как это дело применить?


Примерно так :


procedure TForm1.Button2Click(Sender: TObject);

type
TArchiveType = (atZIP, atRAR);

function FileIsSuitable(const AFileName : String ; const AType : TArchiveType) : Boolean;
const
ZIP_SIGNATURE = $4B50;
RAR_SIGNATURE = $21726152;
var
ABytesToRead : Word;
AFile : file of Byte;
ABuffer : PByteArray;
ASignature : LongWord;
ACorrectSize : Boolean;
begin
Result := False;
ASignature := 0;
ABytesToRead := 0;
try
if not FileExists(AFileName) then Exit;
case AType of
atZIP : ABytesToRead := 2;
atRAR : ABytesToRead := 4;
end; //case
AssignFile(AFile, AFileName);
ABuffer := AllocMem(ABytesToRead * SizeOf(Byte));
try
Reset(AFile);
ACorrectSize := FileSize(AFile) >= ABytesToRead;
if ACorrectSize then begin
BlockRead(AFile, ABuffer^, ABytesToRead);
Move(ABuffer^, ASignature, ABytesToRead)
end; //if
finally
FreeMem(ABuffer, ABytesToRead * SizeOf(Byte));
CloseFile(AFile);
end; //try
if ACorrectSize then begin
case AType of
atZIP : Result := ASignature = ZIP_SIGNATURE;
atRAR : Result := ASignature = RAR_SIGNATURE;
end; //case
end; //if
except
raise;
end; //try
end; //FileIsSuitable

begin
WriteLn(FileIsSuitable("D:\Projects\Delphi\5
\Mttl\Storage\9.zip", atZIP));
WriteLn(FileIsSuitable("D:\Projects\Delphi\5
\Mttl\Storage\Examples.rar", atRAR));
end;



Страницы: 1 вся ветка

Текущий архив: 2002.08.15;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
4-48361
dubel
2002-06-05 17:30
2002.08.15
API


1-48045
lak_b
2002-08-04 01:22
2002.08.15
caption + edit


1-48202
zor
2002-08-03 00:04
2002.08.15
Чтение файлов в директории


1-48069
Nikoss
2002-08-04 18:29
2002.08.15
Работа с таблицей StringGrid


3-47978
vadim2
2002-07-26 14:47
2002.08.15
порядок событий у tdataset?