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.

0

Jeżeli z kodami przedstawionymi:
http://4programmers.net/Forum/1102187
http://4programmers.net/Forum/1102275
nie przechodzi to obstawiam zepsuty UPX.

0
_13th_Dragon napisał(a):

Jeżeli z kodami przedstawionymi:
http://4programmers.net/Forum/1102187
http://4programmers.net/Forum/1102275
nie przechodzi to obstawiam zepsuty UPX.

uzywam najnowszej wersji upx-a.

0

W jaki sposób umieszczasz w pliku sygnaturkę [[delimi1]]tekst extraact[[delimit2]]? Czy jeśli otworzysz skompresowany plik exe pod hexedytorem możesz je odnaleźć?
Te funkcje powinny działać dla każdego pliku zarówno txt jak i binarnego. Bardzo mało prawdopodobne, że UPX psuje kod odczytu pliku.
Na stronie UPX'a jest też sekcja "Overlay Handling Options", ale domyślne zachowanie powinno i tak kopiować tą sygnaturkę. Upewnij się jak to wygląda pod hexedytorem.

2
Świetny Kot napisał(a):

dzieki ale nie, potrzebuje ten kod poprawic ktory zalaczylem.

Nie pojmuje takiego rozumowania. Piszesz na forum z prośbą o pomoc. Ale kiedy dostajesz przykład kodu najprościej realizującego to co chcesz osiągnąc. Rownież korzystający z elementów nie opartych ani o VLC ani o WinAPI. Czyli mamy AssignFile, BlockWrite/Read, to piszez że wolisz po swojemu, gdzie Twój kod nie działa. Podsumowując to po co prosić innych użytkowników z forum o pomoc i marnować ich czas? Skoro otrzymując jakieś rozwiązania i tak je negujesz. Powinieneś więc radzić sobie sam. A i rozwiązanie jakie podał Dragon również powinno działać ok. A z UPXem jest jak napisał poprzednik.

0

Przypomniało mi się że kiedyś użyłem zwykłego: strip.exe z MinGW
Zaczął skubany psuć mi exe okazało się że był dla 64 bitowej wersji i nie chciał współgrać z 32 bitowymi.

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