Показать сообщение отдельно
  #5  
Старый 24.07.2009, 23:19
LIC LIC вне форума
Прохожий
 
Регистрация: 13.07.2009
Сообщения: 6
Репутация: 10
По умолчанию

Доброе время суток.
Благодаря подсказке уважаемого 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

Это один из вариантов, пробовал разные варианты.
Где моя ошибка? Подскажите пожалуйста.
Ответить с цитированием