Доброе время суток.
Благодаря подсказке уважаемого lmikle освоил и реализовал FileStream поток, смог решить свою задачу, но вот возникла новая проблема. После открытия исследуемого файла пр-рой OpenDialog создаем новый файл при помощи FileStream нужного размера и проверяем CRC, если есть не равенство с искомым, то создаем новый файл с размером меньше на один байт и так по кругу. Но после определенного круга Windows выдает ошибку, что не может найти исходный файл, в чем проблема, может кто сталкивался.
Код:
function TForm1.FileCRC32(const FileName: string): Cardinal;
var
InFile, Stream1, Stream2 : TFileStream;
crc32: Int64;
Res: Int64;
BufPtr: Pointer;
Sz, Ps: Integer;
S1, S2: Int64;
begin
Ps:= StrToInt('$'+LabeledEdit2.Text);
BufPtr := @Buf;
crc32 := $FFFFFFFF;
try
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Stream1 := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
Stream1.Seek(Ps, soBeginning);
Stream2 := TFileStream.Create('Temp.tmp', fmCreate, fmOpenWrite);
Stream2.Seek(0, soBeginning);
Sz := Stream1.Size ;
Sz:= Sz-Ps;
Stream2.CopyFrom(Stream1, Sz);
finally
Stream2.Free;
Stream1.Free;
end;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
try
InFile := TFileStream.Create('Temp.tmp', fmOpenRead);
InFile.Seek(0, soBeginning);
Res := InFile.Read(Buf, BufLen);
while (Res <> 0) do
begin
crc32 := UpdateCrc32(crc32, BufPtr, Res);
Res := InFile.Read(Buf, BufLen);
end;
InFile.Destroy;
except
on E: Exception do
begin
if Assigned(InFile) then
InFile.Free;
ShowMessage(Format('При обработке файла [%s] произошла ' +
'ошибка [%s]', [FileName, E.Message]));
end;
end;
Result:= crc32; //XOR Out not = FFFFFFFF
LabeledEdit4.Text:=IntToHex(CRC32,8);
begin
DeleteFile('Temp.tmp');
Inc(Ps);
LabeledEdit2.Text:=IntToHex(Ps,8);
S1:= StrToInt('$'+ LabeledEdit3.Text);
S2:= CRC32;
if Pointer(S1) = Pointer(S2) then
begin
Ps:= StrToInt('$'+LabeledEdit2.Text);
LabeledEdit2.Text:=IntToHex(Ps,8);
end
Это один из вариантов, пробовал разные варианты.
Где моя ошибка? Подскажите пожалуйста.