Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Append und Binär-Dateien (https://www.delphipraxis.net/25792-append-und-binaer-dateien.html)

-=andreas=- 12. Jul 2004 15:57


Append und Binär-Dateien
 
Hi

Ich habe hier etliche kleine wav-Dateien, die ich in einer festgelegten Reihenfolge aneinanderreihen möchte.
Eine Prozedur, die zwei Quell- in eine neue Zieldatei schreibt habe ich. Diese arbeitet aber viel zu langsam, da zwei temporäre Dateien jeweils als Quelle/Ziel gewählt werden und immer überschrieben werden.

Gibt es einen Befehl wie append, der eine Binärdatei an eine andere anhängt, oder weiß jemand eine Optimierungsmöglichkeit für meine Prozedur?


Delphi-Quellcode:
procedure kopieren(datei1,datei2, ziel : string);
type puffer = array [1..60000] of byte;
var file1, file2, file3 : file;
    pufzeiger          : ^puffer;
    anzahl_bytes       : longint;
begin
  assign(file1, datei1);
  assign(file2, datei2);
  assign(file3, ziel);
  reset(file1);
  reset(file2);
  rewrite(file3);
  new(pufzeiger);
  while not eof(file1) do
    begin
    blockread(file1, pufzeiger^, sizeof(pufzeiger^), anzahl_bytes);
    blockwrite(file3, pufzeiger^, anzahl_bytes);
    end;
  while not eof(file2) do
    begin
    blockread(file2, pufzeiger^, sizeof(pufzeiger^), anzahl_bytes);
    blockwrite(file3, pufzeiger^, anzahl_bytes);
    end;
  dispose(pufzeiger);
  close(file1); close(file2); close(file3);
end;

shmia 12. Jul 2004 16:23

Re: Append und Binär-Dateien
 
Zitat:

Zitat von -=andreas=-
Ich habe hier etliche kleine wav-Dateien, die ich in einer festgelegten Reihenfolge aneinanderreihen möchte.

Ob das funktioniert ??? WAV-Dateien beginnen doch mit einem Header, oder nicht ?
Folgende Procedure kopiert binäre Dateien aneinander (falls das Ziel schon exisitiert, wird angehängt):
Delphi-Quellcode:
procedure InternalConcatFiles(const DstFile,SrcFile: string);
var
   SrcStream,DstStream: TFileStream;
begin
   SrcStream := TFileStream.Create(SrcFile,fmOpenRead or fmShareDenyWrite);
   DstStream := nil;
   try
      if not FileExists(DstFile) then
      begin
         DstStream := TFileStream.Create(DstFile,fmCreate);
      end
      else
      begin
         DstStream := TFileStream.Create(DstFile,fmOpenWrite);
         DstStream.Position := DstStream.Size;
      end;

      DstStream.CopyFrom(SrcStream, SrcStream.Size); // copy data
   finally
      SrcStream.Free;
      DstStream.Free;
   end;
end;

-=andreas=- 12. Jul 2004 17:06

Re: Append und Binär-Dateien
 
Das mit den Dateien klappt schon, ich habe die vorher mit dem DragonUnpacker aus einem Spiel ausgepackt und will das nun neu packen.

Gibt es eine Möglichkeit die Prozedur mit FreePascal zu kompilieren, oder muss ich Delphi installieren?

Chewie 12. Jul 2004 17:10

Re: Append und Binär-Dateien
 
Zitat:

Zitat von -=andreas=-
Gibt es eine Möglichkeit die Prozedur mit FreePascal zu kompilieren, oder muss ich Delphi installieren?

Probiers aus. Aber Streams sollten bei FreePascal schon enthalten sein, die alten Pascal-Files sowieso.

-=andreas=- 13. Jul 2004 20:34

Re: Append und Binär-Dateien
 
FPC konnte es auch mit Delphi-Unterstützung nicht kompilieren, aber zum Glück gibt es die c't :D

Danke für die Prozedur, jetzt werde ich nur noch etwas über Datei-/Verzeichnisoperationen lesen, damit ich nicht tausende InternalConcatFiles()-Zeilen im Code habe ;)

The-X 14. Jul 2004 13:32

Re: Append und Binär-Dateien
 
Append für BInärdateien gibt es so nicht, aber du kannst per Seek(f,Filesize(f)); den Datei-Zeiger ans Ende setzen (genauso wie Append es auch tut) die Datei muss dafür natürlich vorher geöffnet sein :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:51 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