Odczyt koncowki pliku EOF.

Odpowiedz Nowy wątek
2015-01-14 14:54
Krzywy Mleczarz
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

Pozostało 580 znaków

2015-01-14 16:32
0

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

Pozostało 580 znaków

2015-01-14 17:09
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;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-14 17:30
Krzywy Mleczarz
0

niestety nie pomoglo.

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26

Pozostało 580 znaków

2015-01-14 17:35
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.

Pozostało 580 znaków

2015-01-14 18:42
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;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2015-01-15 09:32

Pozostało 580 znaków

2015-01-15 08:13
Krzywy Mleczarz
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

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26
Miało być Delimit1 oczywiście - _13th_Dragon 2015-01-15 09:31

Pozostało 580 znaków

2015-01-15 10:52
Świetny Kot
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.

Pozostało 580 znaków

2015-01-15 11:15
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.


Pozostało 580 znaków

2015-01-15 11:31
Świetny Kot
0

dzieki ale nie, potrzebuje ten kod poprawic ktory zalaczylem.

Pozostało 580 znaków

2015-01-15 11:33
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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