Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Datei ändern, aber wie? (https://www.delphipraxis.net/23994-datei-aendern-aber-wie.html)

Imagination 13. Jun 2004 17:54


Datei ändern, aber wie?
 
Guten Tag,

ich hänge mit diesen Funktionen Dateien an eine Andere.

Delphi-Quellcode:
function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
  aStream: TFileStream;
  iSize: Integer;
begin

   Result := False;
   if not FileExists(AFileName) then
      exit;
   try
      aStream := TFileStream.Create(AFileName, fmOpenWrite or fmShareDenyWrite);
      MemoryStream.Seek(0, soFromBeginning);
      aStream.Seek(0, soFromEnd);
      aStream.CopyFrom(MemoryStream, 0);
      iSize := MemoryStream.Size + SizeOf(Integer);
      aStream.Write(iSize, SizeOf(iSize));
   finally
      aStream.Free;
   end;
   Result := True;

end;
Anhängen:
Delphi-Quellcode:
zipStream := TMemoryStream.Create;
zipStream.LoadFromFile('d:\EineDatei.zip'); //immer eine Andere
AttachToFile('d:\kid.jpg', zipStream); //immer die gleiche Datei
zipStream.SaveToFile('d:\ergebnis.jpg');
zipStream.Free;
Wenn ich der Zip-File das Bild anhänge, so kann ich nach dem Doppelklick auf ergebnis.jpg das Bild kid.jpg öffnen. Wenn ich die Datei ergebnis.jpg einfach in ergebnis.zip umbenenne, dann kommt ein CRC-Fehler, was natürlich logisch ist.
Nun möchte ich aber die Bytes, die ich angehängt habe, wieder abschneiden, damit ich das Zip-File öffnen kann.

Mein Ansatz. Herausfinden wie große kid.jpg ist:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
kid : TMemoryStream;
begin
kid := TMemoryStream.Create();
kid.LoadFromFile('d:\kid.jpg');
showmessage(IntToStr(kid.Size));
schneiden := kid.Size;
kid.free;
SplitFile('d:\EineDatei.zip');

end;
Jetzt den Rest abschneiden:
Delphi-Quellcode:
function SplitFile(FileName : TFileName ) : Boolean;
var
  i : Word;
  fs, sStream: TFileStream;
begin
  fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  sStream := TFileStream.Create('d:\ergebnis.jpg', fmCreate or fmShareExclusive);
  try
      sStream.CopyFrom(fs, (fs.Size-schneiden)); //schneiden ist Größe von kid.jpg
    finally
        sStream.Free;
        fs.Free;
      end;
end;
Wenn ich jetzt ergebnis.jpg in ergebnis.zip umbenenne, zeigt er mir einen CRC-Fehler an. Muss ich noch einen Header verschicken?

Ich bin noch relativ großer Anfänger und bin für jede Hilfe sehr dankbar! :angle:

P.S. Hoffentlich ist es jetzt etwas verständlicher.

SirThornberry 13. Jun 2004 18:38

Re: Datei ändern, aber wie?
 
ich versteh die frage nicht ganz (find die unklar formuliert).

Wieso das? (ergibt ja logicher Weise rekursion und bringt nix)
Zitat:

Da ich aber an irgendeine Datei immer die gleiche Datei anhänge
Sag am besten was du erreichen willst mit dem anhängen der Dateien an eine Andere, veilleicht versteht man dann die Problematik besser oder kann einen besseren Lösungsansatz geben

Und wo ist der Sinn das du einem Archiv (zip) eine Datei hinzufügst(anhängst) und das geänderte Archiv dann als jpg speicherst?

Imagination 13. Jun 2004 20:34

Re: Datei ändern, aber wie?
 
Ich möchte einfach verstehen, wie das funktioniert. Nachdem ich der EineDatei.zip das Bild kid.jpg angehängt und in ergebnis.jpg gespeichert habe, wird nach Öffnen von ergebnis.jpg das kid.jpg Bild geöffnet. Ohne Fehler. Wenn ich ergebnis.jpg in ergebnis.zip umbenenne, kommt ein CRC-Fehler beim Öffnen in WinRAR. Also müsste ich doch eigentlich die angehängten Bytes abschneiden? Habe es gemacht, glaube ich, und es klappt immer noch nicht.

Imagination 14. Jun 2004 20:31

Re: Datei ändern, aber wie?
 
Hab das Problem gefunden:
Delphi-Quellcode:
aStream.Write(iSize, SizeOf(iSize));
Das hatte ich nicht ganz beachtet beim Abschneiden!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz