Главная страница
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.01 c
1-48077
Dmk
2002-08-05 01:25
2002.08.15
Какой тип?


4-48366
antonp
2002-06-10 22:41
2002.08.15
Как узнать Id процесса?


1-48173
kserg@ukr.net
2002-08-02 12:59
2002.08.15
Report: связка Master - Detail


1-48199
Nikoss
2002-08-02 23:22
2002.08.15
Три вопроса. Работа с двумерным массивом


14-48246
mvg_first
2002-07-18 19:28
2002.08.15
Кто и как использует продукты Rational