Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Datei mit TStream kopieren (https://www.delphipraxis.net/103780-datei-mit-tstream-kopieren.html)

Antigo 22. Nov 2007 18:14

Re: Datei mit TStream kopieren
 
so ich hab das jetzt mal umgemodelt, also das selbe was ich mit streams gemacht hab auf untypisierte Dateien und Blockread/Blockwrite umgebaut.

Delphi-Quellcode:
var FInput,FOutput: File;
    i, buffersize,transferred:integer;
    buffer:array of Byte;
begin
  buffersize:=strtoint(edit3.Text);
  AssignFile(FInput,edit1.Text);
  Reset(FInput,1);

  AssignFile(FOutput,edit2.Text);
  Rewrite(FOutput,1);

  setlength(buffer,buffersize);
  for i:=1 to floor(FileSize(FInput) / buffersize) do
  begin
    Blockread(FInput,buffer[0],buffersize,transferred);
    Blockwrite(FOutput,buffer[0],buffersize,transferred);

    Seek(FInput,i*buffersize);


     //Status
    Progressbar1.Position:= 100*i*buffersize div FileSize(FInput);
    label2.caption:=inttostr(i*buffersize) +' / '+ inttostr(FileSize(FInput));
    Application.ProcessMessages;
  end;

  Progressbar1.Position:=100;
  label2.caption:=inttostr(FileSize(FInput)) +' / '+ inttostr(FileSize(FInput));
Das Ergebnis ist identsich. Statusbar läuft durch. Alle Befehle werden abgearbeitet, aber die Übertragung geht noch lange Zeit nach durchlauf der for Schleife weiter.

Mir fällt jetzt auch nix weiter mehr ein. Falls noch jemand eine Idee hat, her damit, ansonsten werd ich das Projekt begraben.

Antigo 24. Nov 2007 12:41

Re: Datei mit TStream kopieren
 
Zitat:

Zitat von sirius
Nicht wirklich.

Die delphieigenen Funktionen:
-assignfile
-resetfile
-rewrite
-closefile
arbeiten wie TFileStream / THandleStream sehr direkt über die WinAPI-Funktionen CreateFile, WriteFile, ReadFile und SetFilePointer

es lässt mich nicht los ^^

Also ich hab mir jetzt mal die API Funktion WriteFile angeschaut. Da steht in der Dokumentation:
Zitat:

WriteFile Function


Writes data to the specified file at the position specified by the file pointer. This function is designed for both synchronous and asynchronous operation.
Also kann es sehr wohl sein, dass das ganze bei mir asynchron arbeitet.

Ich hab noch nie direkt mit den Windows API Funktionen gearbeitet (zum. nicht wissentlich ^^)

Kann mir da vielleicht jemand weiterhelfen?

Apollonius 24. Nov 2007 13:11

Re: Datei mit TStream kopieren
 
Nein, denn für asynchronen Gebrauch muss CreateFile mit FILE_FLAG_OVERLAPPED aufgerufen worden sein - du arbeitest immer synchron, sofern du nichts anderes bei CreateFile sagst.

Antigo 24. Nov 2007 13:30

Re: Datei mit TStream kopieren
 
ok gut zu wissen. Aber ich arbeite ja nicht direkt mit den API Funktionen, sondern mit assignfile, blockwrite etc.
Woher weiss ich denn, was delphi mit diesen Fkt. macht?

Apollonius 24. Nov 2007 13:52

Re: Datei mit TStream kopieren
 
Einfach mal ein bisschen in System.pas stöbern. Nach weniger als einer Minute bin ich eben auf die Funktion TextOpen gestoßen, die, in der auskommentierten Pascal-Fassung (es wird zum Kompilieren Assembler verwendet), die Zeile
Delphi-Quellcode:
CreateFileA(t.Name, OpenMode, FILE_SHARE_READ, nil, Flags, FILE_ATTRIBUTE_NORMAL, 0);
enthält. Also kein FILE_FLAG_OVERLAPPED im vorletzten Parameter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:52 Uhr.
Seite 3 von 3     123   

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