AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TFileStream - irgendwie raff ichs net

Ein Thema von Predator · begonnen am 26. Okt 2003 · letzter Beitrag vom 27. Okt 2003
Antwort Antwort
Seite 1 von 2  1 2      
Predator
(Gast)

n/a Beiträge
 
#1

TFileStream - irgendwie raff ichs net

  Alt 26. Okt 2003, 19:42
moin Jungs,

also ich versuche per TFileStream eine Datei einzulesen und wieder zu speichern (ich will später dann noch eine Verschlüsselungsroutine dazusetzten, das kommt dann aber in einen eigenen Thread). Jetzt mach ich das so:

Delphi-Quellcode:
function Kopiere(Input,Output: string) : string;
var
    fs,dest : TFileStream;
    Buffer : Byte;
begin
    fs := TFileStream.Create(Input, fmReadOnly);
    fs.Read(Buffer, fs.size);
try
    dest := TFileStream.Create(Output, fmCreate);
    dest.Write(Buffer, sizeof(Buffer));
finally
    FreeAndNil(fs);
    FreeAndNil(dest);
end;
end;
so nur irgendwie kommt manchmal ne Zugriffsverletzung bei Adresse irgendwas oder die Datei wird erstellt nur nichts kopert (0 KB);

Was hab ich da falsch gemacht ? Ich sitze jetzt schon seit gestern Abend daran das gibts doch net.

Hat jemand ein Tut wo alles über Streams(Memory,File,u.s.w.) steht ?

Danke !!!!

cu
Predator
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: TFileStream - irgendwie raff ichs net

  Alt 26. Okt 2003, 19:47
Delphi-Quellcode:
var
  InPutS, OutPutS: TFileStream;
  Mode: Word;
begin
  InPutS := TFileStream.Create(InPut, fmOpenRead or fmShareDenyNone);

  if not FileExists(OutPut) then Mode := fmCreate else Mode := fmOpenWrite;
  OutPutS := TFileStream.Create(OutPut, Mode or fmShareDenyNone);

  try
    OutPutS.Position := 0;
    OutPutS.CopyFrom(InPutS, 0); // Kopiert InPut Datei nach OutPut;
    // restliche verarbeitung von OutPutS
  finally
    OutPutS.Free;
    InPutS.Free;
  end;
end;
so solltes gehn.

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: TFileStream - irgendwie raff ichs net

  Alt 26. Okt 2003, 20:00
Das reine Kopieren auf eine Schlag nützt ihm nichts, wenn er noch was dazwischen hängen will.

Delphi-Quellcode:
            GetMem(Buffer, 1024);
            try
              // as long as we have not reached the end of the source stream
              while (SrcStream.Position < SrcStream.Size) do
              begin
                // how much to read
                if SrcStream.Size - SrcStream.Position > BlockSize then
                  Len := BlockSize
                else
                  Len := SrcStream.Size - SrcStream.Position;
                // read into the buffer
                SrcStream.ReadBuffer(Buffer^, Len);
                // encode the buffer
                EncodeBuffer(Buffer^, Buffer^, len);
                // write the buffer
                DestStream.WriteBuffer(Buffer^, Len);
              end;
            finally
              // clean up the buffer
              FreeMem(Buffer);
            end;
Buffer ist als Pointer deklariert. BlockSize ist eien Konstante, die angibt wie vile jewals gelesen werden soll. Ich habe sie mit 1024 initialisiert.
Das EncodeBuffer ist aus Hagen Reddmanns DEC, dürfte dich erstmal nicht interessieren.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Predator
(Gast)

n/a Beiträge
 
#4

Re: TFileStream - irgendwie raff ichs net

  Alt 26. Okt 2003, 20:17
@Luckie

was ist jetzt wenn ich nicht nur 1024 KB einlesen will sondern die ganze Datei ?
z.b: ein 10 MB großes File ?

Und wie man ja so schön sagt : Aus Fragen lernt man

also:

Delphi-Quellcode:
try
              // as long as we have not reached the end of the source stream
              while (SrcStream.Position < SrcStream.Size) do
              begin
                // how much to read
                if SrcStream.Size - SrcStream.Position > BlockSize then
                  Len := BlockSize
                else
                  Len := SrcStream.Size - SrcStream.Position;
                // read into the buffer
Was wird da genau gemacht ?


SrcStream.ReadBuffer(Buffer^, Len); Was ist der unterschied zwischen readBuffer und Read bzw. WriteBuffer und Write ?


Danke im Voraus.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#5

Re: TFileStream - irgendwie raff ichs net

  Alt 26. Okt 2003, 20:20
Moin Predator,

Antwort auf Frage 1:
das ganze ist eine Schleife, die solange 1024er Blöcke verschlüsselt, bis nix mehr von der datei das ist (wenn weniger als 1024 übrig sind, dann nimmt der den Rest)
David F.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: TFileStream - irgendwie raff ichs net

  Alt 26. Okt 2003, 20:27
Ich dachte der Code ist mit den Kommentaren selbst erklärend. Aber gut.
Als erstes reservieren wir 1024 Byte Speicher.
Dann kommt die Schleife, die so lange läuft, bis der Dateizeiger am Ende der Quelldatei angekommen ist.
In der Schleife werden 1024 Blöcke gelesen, verschlüssel und wieder geschrieben. Da es nun sein kann, dass die Quelldateigröße kein Vielfaches von 1024 ist, ziehen wir von der Größe der Quelldatei die aktuelle Position ab und kucken so, ob noch 1024 Byte gelesen werden können. Ist dies der Fall werden 1024 Byte gelesen, wenn nicht nur noch so viel, wie übrig ist.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Predator
(Gast)

n/a Beiträge
 
#7

Re: TFileStream - irgendwie raff ichs net

  Alt 26. Okt 2003, 20:28
@Luckie

ich hab den Code jetzt mal in meinen angepasst. Müsste so richtig sien oder ?

Delphi-Quellcode:
function Kopiere(Input, Output: string) : string;
const
BlockSize = 1024;
var
fs: TFileStream;
Buffer: Pointer;
Len: Integer;
dest: TFileStream;
begin
fs := TFileStream.Create(Input, fmOpenRead);
dest := TFileStream.Create(Output, fmCreate);
GetMem(Buffer, 1024);
try
while (fs.Position < fs.Size) do
begin
if fs.Size - fs.Position > BlockSize then
Len := BlockSize
else
Len := fs.Size - fs.Position;

fs.ReadBuffer(Buffer^, Len);
dest.WriteBuffer(Buffer^, Len);
end;
finally
FreeMem(Buffer);
end;
end;
hab jetzt mal schnell copy,paste ohne Formatierung kopiert.

Trotzdem ist das File 0 KB.
  Mit Zitat antworten Zitat
Predator
(Gast)

n/a Beiträge
 
#8

Re: TFileStream - irgendwie raff ichs net

  Alt 26. Okt 2003, 20:53
sorry hat sich schon erledigt.

der hatte mein Testfile überschrieben beim Fehler deswegen war output auch 0 KB bin ich blöd

Gibt es irgendwo ein Tutorial bzw. Referenzen zum DEC vom Herrn Reddmann ?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: TFileStream - irgendwie raff ichs net

  Alt 26. Okt 2003, 20:58
In dem Thread: http://www.delphipraxis.net/internal...erschl%FCsseln gibt es gegen Ende Beispiel Code von mir und Daniel.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Predator
(Gast)

n/a Beiträge
 
#10

Re: TFileStream - irgendwie raff ichs net

  Alt 26. Okt 2003, 21:09
ok danke nochwas:

wie kann ich jetzt z.B. am Anfang und ende das noch einfügen ?

[START CODE]
[END CODE]

???

Habs mit dest.Write versucht aber dann ist der rest nicht komplett.

Danke im voraus.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:25 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