Odczyt koncowki pliku EOF.

0

Witam,

mam taki kod ktory odczytuje koniec pliku ..

 function ReadFile(FileName: String): AnsiString;
var
  F             :File;
  Buffer        :AnsiString;
  Size          :Integer;
  ReadBytes     :Integer;
  DefaultFileMode:Byte;
begin
  Result := '';
  DefaultFileMode := FileMode;
  FileMode := 0;
  AssignFile(F, FileName);
  Reset(F, 1);

  if (IOResult = 0) then
  begin
    Size := FileSize(F);
    while (Size > 1024) do
    begin
      SetLength(Buffer, 1024);
      BlockRead(F, Buffer[1], 1024, ReadBytes);
      Result := Result + Buffer;
      Dec(Size, ReadBytes);
    end;
    SetLength(Buffer, Size);
    BlockRead(F, Buffer[1], Size);
    Result := Result + Buffer;
    CloseFile(F);
  end;

  FileMode := DefaultFileMode;
end;

function ReadEof(Delimit1, Delimit2 :String) :String;
var
  Buffer      :AnsiString;
  ResLength   :Integer;
  i           :Integer;
  PosDelimit  :Integer;
begin
  Buffer := ReadFile(ParamStr(0));
  if Pos(Delimit1, Buffer) > Pos(Delimit2, Buffer) then
    PosDelimit := Length(Buffer)-(Pos(Delimit1, Buffer)+Length(Delimit1))
  else PosDelimit := Length(Buffer)-(Pos(Delimit2, Buffer)+Length(Delimit2));
  Buffer := Copy(Buffer, (Length(Buffer)-PosDelimit), Length(Buffer));
  ResLength := Pos(Delimit2, Buffer)-(Pos(Delimit1, Buffer)+Length(Delimit1));
  for i := 0 to (Reslength-1) do
    Result := Result+Buffer[Pos(Delimit1, Buffer)+(Length(Delimit1)+i)];
end;

uzycie :

ReadEof('[[delimit1]]','[[delimit2]]');

kod zwraca wartosc pomiedzy atrybutami delimit1 i delimit2

wszystko chodzi pieknie, ładnie, pojawia sie problem gdy program spakuje upx-em, wtedy nie potrafi znalezc delimitow i nie odczyta stringa pomiedzy nimi, dodam ze tekst delimit1moj tekstdelimit2 jest zawsze na koncu pliku i nie jest spakowany..dziekuje za pomoc

0

Pokaż próbki plików - ten który przechodzi i ten który nie przechodzi.

0

Może to ci pomoże:

function ReadFile(const FileName:String):AnsiString;
var fs:TFileStream;
begin
  fs:=TFileStream.Create(FileName,fmOpenRead);
  try
    SetLength(Result,fs.Size);
    fs.Read(@Result[1],Length(Result));
  finally
    fs.Free;
  end;
end;
0

niestety nie pomoglo.

0

Pewnie, że nie pomogło to tylko skrócona wersja tego co miałeś ta druga funkcja też jest fatalnie napisana. Skoro to działało to problem jest w plikach które przetwarzasz. Nie bardzo rozumiem czy ty parsujesz pliki exe spakowane UPXem czy Twój program psuje się po spakowaniu. Bez próbek niewiele można powiedzieć. Napisz też z jakimi parametrami go używasz i jaka wersja UPX'a. Można zmienić kompresor, albo parametry kompresji.

0

No to jeszcze tu zrobić porządek:

function ReadEof(const Delimit1,Delimit2 :String) :String;
var Buffer:String;
var p1,p2:Integer;
begin
  Buffer:=ReadFile(ParamStr(0));
  p1:=Pos(Delimit1,Buffer);
  p2:=Pos(Delimit2,Buffer);
  if p1<p2 then Result:=Copy(Buffer,p1+Length(Delimit1),p2-p1-Length(Delimit1))
  else Result:=Copy(Buffer,p2+Length(Delimit2),p1-p2-Length(Delimit2));
end;
0
szopenfx napisał(a):

Pewnie, że nie pomogło to tylko skrócona wersja tego co miałeś ta druga funkcja też jest fatalnie napisana. Skoro to działało to problem jest w plikach które przetwarzasz. Nie bardzo rozumiem czy ty parsujesz pliki exe spakowane UPXem czy Twój program psuje się po spakowaniu. Bez próbek niewiele można powiedzieć. Napisz też z jakimi parametrami go używasz i jaka wersja UPX'a. Można zmienić kompresor, albo parametry kompresji.

  1. skompiluje program.

  2. nastepnie dodam na koncu pliku tekst "delimi1tekst extraactdelimit2"

  3. działa, wyciagnie tekst pomiedzy delimitami

  4. skompiluje program.

  5. spakuje go upx-em, standardowo upx.exe project1.exe

  6. dodam na koncu pliku tekst [[delimi1]]tekst extraact[[delimit2]]

  7. nie dziala, nie wyciagnie tekstu pomiedzy delimitami.

 function ReadEof(const Delimit1,Delimit2 :String) :String;
var Buffer:String;
var p1,p2:Integer;
begin
  Buffer:=ReadFile(ParamStr(0));
  p1:=Pos(Delimit1,Buffer);
  p2:=Pos(Delimit2,Buffer);
  if p1<p2 then Result:=Copy(Buffer,p1+Length(p1),p2-p1-Length(p1))
  else Result:=Copy(Buffer,p2+Length(p2),p1-p2-Length(p2));
end;

to nie przechodzi, wyswietla blad w lini z

if p1<p2 then Result:=Copy(Buffer,p1+Length(p1),p2-p1-Length(p1))

Length(p1) ??

dodanie znacznika <code class="delphi"> - @furious programming

0
_13th_Dragon napisał(a):

No to jeszcze tu zrobić porządek:

function ReadEof(const Delimit1,Delimit2 :String) :String;
var Buffer:String;
var p1,p2:Integer;
begin
Buffer:=ReadFile(ParamStr(0));
p1:=Pos(Delimit1,Buffer);
p2:=Pos(Delimit2,Buffer);
if p1<p2 then Result:=Copy(Buffer,p1+Length(Delimit1),p2-p1-Length(Delimit1))
else Result:=Copy(Buffer,p2+Length(Delimit2),p1-p2-Length(Delimit2));
end;

dzieki za pomoc, ale dalej nic z tego.

0

Chodzi Tobie o takie coś jak w tym dołączonym kodzie? Przekopiuj sobie exek jako test.exe do sprawdzania. U mnie mimo spakowania UPXem wszystko działa ok, bo plik nadal ma tak zwany overlay po którym dopisuje nowy tekst.

0

dzieki ale nie, potrzebuje ten kod poprawic ktory zalaczylem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0