Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dateigröße auslesen (https://www.delphipraxis.net/22879-dateigroesse-auslesen.html)

robertthronhill 25. Mai 2004 16:47


Dateigröße auslesen
 
Hallo!

Mein Problem ist folgendes:
Ich programmiere zur Zeit an einem Programm mit dem man chatten und Dateien versenden kann. Alles funktioniert prima, aber ich möchte nun einen Fortschrittsbalken einbauen, dass man etwa weis, wann die Datei fertig up-/downgeloadet ist. Ich verwende dazu die delphieigene Fortschrittsanzeige Progressbar.
1. Fall (Download; wenn man eine Datei geschickt bekommt):
Wenn man eine Datei geschickt bekommt sieht die Delphiprocedure so aus:
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  fs: TFileStream;
  SizeOfIncomingStream: integer;
begin
  if not SaveDialog1.Execute then exit;
  fs := TFileStream.Create(SaveDialog1.Filename, fmCreate or fmShareExclusive);
  with AThread.Connection do
    try
      SizeOfIncomingStream := ReadInteger;
      ReadStream(fs, SizeOfIncomingStream);
    finally
      Disconnect;
      fs.Free;
    end;
end;
Um die Progressbar nun zum laufen zu bringen verwende ich folgende "Formel":
Code:
Progressbar.Position:=(erhalteneBytes*100)div gesammteBytes
Wie lese ich nun die schon erhaltenen Bytes (=die Dateigröße) aus. Mein Problem an der Sache ist vorallem, dass ich nicht weis, wie ich den Namen der Datei aus dem SaveDialog heraus bekomme. Außerdem habe ich keine Ahnung wie ich aus einer Datei die Dateigröße auslese.

2.Fall (Upload; man schickt jemandem eine Datei)
Hierzu sieht mein Sourcecode so aus:
Delphi-Quellcode:
procedure TForm1.Button6Click(Sender: TObject);
var
  fs: TFileStream;
begin
  if not OpenDialog1.Execute then exit;
  with IdTCPClient1 do
  begin
    fs := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyWrite);
    Connect;
    try
      OpenWriteBuffer;
      try
        WriteStream(fs, true, true);
        CloseWriteBuffer;
      except
        CancelWriteBuffer;
        raise;
      end;
    finally
      Disconnect;
      fs.Free;
    end;
  end;
end;
Dieses mal möchte ich wieder eine Progressbar haben, die anzeigt, wie weit der Upload ist. "Formel":
Code:
Progressbar.Postition:=(gesendeteBytes*100)div gesammteBytes
Ich glaube, dass dieser Fall ein weitaus schwierigeres Problem ist, als der 1.. Dieses Mal habe ich noch weniger Ahnung als beim 1. Fall. Muss ich da irgendwie die gesendeten Bytes in einer Variablen mitzählen, oder gibt es da einen anderen (einfacheren) Weg. Wenn ich die Bytes mitzählen lassen muss, wie mache ich das dann? Kann ich das mit dem IndyClient machen?

Puh, das ist ein großer Beitrag.
Danke schon mal im Vorraus für euere Hilfe

mfg
robertthronhill

P.S.: Ich weis, dass ich den Code aus der Codelibrary kopiert habe :-D .

glkgereon 26. Mai 2004 07:40

Re: Dateigröße auslesen
 
so tut mir leid, ich hab mir den qt nit asngeguckt... :-)
(hab im mom nicht soviel zeit)

aber mit savedialog namen:
Delphi-Quellcode:
if savedialod1.execute then
begin
Filename:=Savedialog1.filename;
end;
soviel dazu

dann sagst du was von dateigröße
such ma in der oh...

in unit sysutils glaub ich

Stevie 26. Mai 2004 08:13

Re: Dateigröße auslesen
 
Guck dir mal das OnWork-Event an, das müsste dann ungefähr folgendermaßen aussehen:
Delphi-Quellcode:
procedure TForm1.IdTCPClient1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
begin
  ProgressBar.StepBy(AWorkCount);
end;
Natürlich muss das noch erweitert werden, aber das ist sicherlich ein Ansatz...

ibp 26. Mai 2004 08:34

Re: Dateigröße auslesen
 
hi,
wegen der Dateigröße shau mal in der Delphi Hilfe unter FileSize nach!

gruß rené

robertthronhill 26. Mai 2004 13:28

Re: Dateigröße auslesen
 
Hallo!

Erstmal möchte ich mich für die rege Hilfe bedanken, habe jetzt aber noch ein Problem.
Und zwar, steuere ich die Statusbar so:
Delphi-Quellcode:
Progressbar1.Position :=(FileSize(SaveDialog1.Filename)*100)div SizeofIncomingStream;
Ich bekomme nun, wenn ich das Programm compiliere den Fehler:
Zitat:

[Fehler] Unit1.pas(148): Inkompatible Typen
Wo liegt mein Fehler? Muss ich das wirklich so machen, wie Stevie das gesagt hat?

Nochmal danke für die Hilfe

mfg
robertthronhill

s14 26. Mai 2004 13:31

Re: Dateigröße auslesen
 
Ich vermute mal es liegt an FileSize.

Aus der OH:

Die Funktion gibt die Anzahl der Datensätze in einer Datei zurück.

Kann also nicht für "normale" Dateien verwendet werden.

Gruß
s14

ibp 26. Mai 2004 13:38

Re: Dateigröße auslesen
 
aus der delphi OH das Beispiel!!!

du kannst nicht nur den den Dateinamen nehmen!!!


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var
   f: file of Byte;
   size: Longint;
   S: string;
   y: Integer;
begin
  if OpenDialog1.Execute then
  begin
    AssignFile(f, OpenDialog1.FileName);
    Reset(f);
    try
      size := FileSize(f);
      S := 'File size in bytes: ' + IntToStr(size);
      y := 10;
      Canvas.TextOut(5, y, S);
      y := y + Canvas.TextHeight(S) + 5;
      S := 'Seeking halfway into file...';
      Canvas.TextOut(5, y, S);

      y := y + Canvas.TextHeight(S) + 5;
      Seek(f, size div 2);
      S := 'Position is now ' + IntToStr(FilePos(f));
      Canvas.TextOut(5, y, S);
    finally
      CloseFile(f);
    end;
  end;
end;

robertthronhill 26. Mai 2004 13:40

Re: Dateigröße auslesen
 
Das ist sehr schlecht. Vorallem sollen ja mit meinem Programm alle möglichen Dateien verschickt werden können. Ind er OH zu FileSize steht auch, dass Textdateien nicht verwendet werden können. Gibt es noch eine andere Möglichkeit die Dateigröße auszulesen?

Stevie 26. Mai 2004 13:42

Re: Dateigröße auslesen
 
Zitat:

Zitat von robertthronhill
Muss ich das wirklich so machen, wie Stevie das gesagt hat?

Natürlich nicht! :roll:
Aber erklär mir mal, wo du die Aktualisierung der ProgressBar durchführen willst?
Im OnExecute geht ja nicht, weil er da nur einmal reinläuft und den Stream einliest.
Der einzige Weg, den ich sehe, ist es im OnWork zu machen, weil das immer wieder durchlaufen wird, solange lese-/schreibtechnisch was passiert. Also, einfach ProgressBar.Max := SizeofIncomingStream und wie oben erklärt.

Aber ich lasse mich gerne eines Besseren belehren! :dance:

ibp 26. Mai 2004 13:43

Re: Dateigröße auslesen
 
wo steht ds denn, daß man keine Textdateien nehmen kann?:

Zitat:

Die Funktion gibt die Anzahl der Datensätze in einer Datei zurück.

Unit

System

Kategorie

Ein-/Ausgabe

Delphi-Syntax:

function FileSize(var F): Integer;

Beschreibung

In Delphi können Sie mit FileSize die Größe der angegebenen Datei (F) ermitteln. Die Größe wird als die Anzahl der Datensätze in einer Datensatzdatei ausgedrückt. Daher gilt folgendes:

Wenn die Datei als Byte-Datei deklariert ist, dann ist ein Datensatz per Vorgabe ein Byte groß, und FileSize gibt die Anzahl der Bytes in der Datei zurück.
Die Prozedur Reset kann die Datensatzgröße (in Bytes) beim Öffnen der Datei setzen. In diesem Fall gibt FileSize die Anzahl der Datensätze in der Datei zurück.

Hinweis: Wenn die Datei untypisiert deklariert ist und Sie beim Aufrufen von Reset keine Datenblockgröße angeben, nimmt FileSize eine Größe von 128 Bytes an. FileSize gibt also die Anzahl der Bytes geteilt durch 128 zurück.

Die Funktion kann nur für geöffnete Dateien verwendet werden. Wenn die Datei leer ist, gibt FileSize(F) 0 zurück.

Stevie 26. Mai 2004 13:52

Re: Dateigröße auslesen
 
Zitat:

Zitat von robertthronhill
Delphi-Quellcode:
Progressbar1.Position :=(FileSize(SaveDialog1.Filename)*100)div SizeofIncomingStream;

Hab ich gerade übersehen. Geht das überhaupt? Wird die Datei nicht erst gespeichert, wenn der Stream geschlossen wird? Ich hab keine Ahnung... :gruebel:

robertthronhill 26. Mai 2004 13:55

Re: Dateigröße auslesen
 
@ibp: Ich habe Delphi6 Enterprise Edition und da steht noch eine Zeile extra:
Zitat:

Hinweis

FileSize kann nicht für Textdateien verwendet werden.
@Stevie: Du hast recht. Sorry, ich habe nicht gewusst, dass der OnExecute-Teil nur einmal ausgeführt wird, ich hätte es mit aber denken können. Ich habe mal in der OH nachgeschaut, werden aber aus der "Hilfe" nicht schlau. Könntest du mir mal den entsprechenden Code für mein Programm schreiben, dass ich da endlich durchblicke? Wenn du den kompletten Code brauchst, dann poste ich ihn später.

Ich danke allen, die mir geholfen haben und denen, die mir noch helfen werden!

mfg
robertthronhill

ibp 26. Mai 2004 14:02

Re: Dateigröße auslesen
 
..du sollst die txt-datei ja nicht zum bearbeiten öffnen, sondern du willst
die info, wie groß die datei ist, das kannst du dann doch so machen...

Delphi-Quellcode:
function TForm1.getfilesize(fname:tFileName):Longint;
var
   f: file of Byte;
begin
  result:=0;
  {$IOChecks OFF}
    AssignFile(f, fname);
    Reset(f);
    result := FileSize(f);
    CloseFile(f);
  {$IOChecks ON}
end;

robertthronhill 26. Mai 2004 15:34

Re: Dateigröße auslesen
 
Ich habe das jetzt auf Stevie's Art gemacht blos irgendwo steckt noch der Wurm drin. Delphi findet keine Fehler, die ProgressBar läuft trotzdem nicht. Ich poste hier mal den kompletten SourceCode.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls, ExtCtrls, IdTCPServer, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, ComCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    ss: TServerSocket;
    Button1: TButton;
    cs: TClientSocket;
    chat: TMemo;
    LabeledEdit1: TLabeledEdit;
    Button2: TButton;
    Label2: TLabel;
    Button3: TButton;
    Edit1: TEdit;
    Button4: TButton;
    Label3: TLabel;
    Button5: TButton;
    Button6: TButton;
    IdTCPClient1: TIdTCPClient;
    IdTCPServer1: TIdTCPServer;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    ProgressBar1: TProgressBar;
    Label4: TLabel;
    Label5: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure IdTCPClient1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  ip: string;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
        Close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
        ip:=LabeledEdit1.Text;
        cs.Host:=ip;
        cs.Active:=True;
        IdTCPClient1.Host:=ip;
end;

procedure TForm1.Button3Click(Sender: TObject);
var msg: String;
begin
        msg:=Edit1.Text;
        chat.Lines.Add(msg);
        cs.Socket.SendText(msg);
        Edit1.Text:='';
end;

procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
var rec: String;
begin
        rec:=Socket.ReceiveText;
        if (rec='Server Message: Someone is pinging you') then
        begin
                chat.Lines.Add(rec);
                cs.Socket.SendText('Server Message: Ping successful. The chat-partner answered.');
        end
        else
        chat.Lines.Add(rec);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
        cs.Socket.SendText('Server Message: Someone is pinging you');
        chat.Lines.Add('Server Message: Ping started');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
        chat.Lines.Add('Server Message: Wellcome to MyChat 1.0');
        chat.Lines.Add('Server Message: Please enter your chat-partners ip in the field at the bottom of the');
        chat.Lines.Add('Server Message: programme and press connect.');
        chat.Lines.Add('Server Message: Then you can ping your chat-partner or send him/her a message.');
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
        chat.Lines.Clear;
end;

procedure TForm1.Button6Click(Sender: TObject);
var
  fs: TFileStream;
begin
  if not OpenDialog1.Execute then exit;
  with IdTCPClient1 do
  begin
    fs := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyWrite);
    Connect;
    try
      OpenWriteBuffer;
      try
        ProgressBar1.Max := fs.Size;
        WriteStream(fs, true, true);
        CloseWriteBuffer;
      except
        CancelWriteBuffer;
        raise;
      end;
    finally
      Disconnect;
      fs.Free;
    end;
  end;
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  fs: TFileStream;
  SizeOfIncomingStream: integer;
begin
  if not SaveDialog1.Execute then exit;
  fs := TFileStream.Create(SaveDialog1.Filename, fmCreate or fmShareExclusive);
  with AThread.Connection do
    try
      ProgressBar1.Max := SizeOfIncomingStream;
      SizeOfIncomingStream := ReadInteger;
      ReadStream(fs, SizeOfIncomingStream);
    finally
      Disconnect;
      fs.Free;
    end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
        cs.Active:=False;
        ss.Active:=False;
        IdTCPServer1.Active:=False;
end;

procedure TForm1.IdTCPClient1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
        if AWorkMode = wmRead then
        ProgressBar1.StepBy(AWorkCount);
        if AWorkMode = wmWrite then
        ProgressBar1.StepBy(AWorkCount);
end;

end.
Hoffentlich findet jemand meinen Fehler. Bin am verzweifeln :freak:
Danke für eurere Hilfe!

mfg
robertthronhill

ibp 26. Mai 2004 15:54

Re: Dateigröße auslesen
 
hallo,
das verstehe ich nicht.....

Delphi-Quellcode:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  fs: TFileStream;
  SizeOfIncomingStream: integer;
begin
  if not SaveDialog1.Execute then exit;
  fs := TFileStream.Create(SaveDialog1.Filename, fmCreate or fmShareExclusive);
  with AThread.Connection do
    try
      ProgressBar1.Max := SizeOfIncomingStream;
      SizeOfIncomingStream := ReadInteger;
      ReadStream(fs, SizeOfIncomingStream);
    finally
      Disconnect;
      fs.Free;
    end;
end;
... du deklarierst: SizeOfIncomingStream: integer;
... dann: weist du der Progressbar1.max diesen wert zu, aber wie groß ist der?
... erst danach weist du SizeOfIncomingStream den wert ReadInteger zu
.. vielleicht solltest du die codezeilen vertauschen!
gruß rene

robertthronhill 26. Mai 2004 16:05

Re: Dateigröße auslesen
 
Danke für den Tipp. Ich habs gleich ausprobiert, es funktioniert aber immernoch nicht.

mfg
robertthronhill

ibp 26. Mai 2004 16:30

Re: Dateigröße auslesen
 
die frage ist doch was kommt bei der progressbar an oder kommt überhaupt was an?

ProgressBar1.Max := SizeOfIncomingStream;
...
ProgressBar1.StepBy(AWorkCount);

lass dir doch mal die werte für SizeOfIncomingStream und AWorkCount anzeigen!

robertthronhill 26. Mai 2004 17:28

Re: Dateigröße auslesen
 
Ich habe versucht das ganze Anzeigen zu lassen. In dieser:
Delphi-Quellcode:
procedure TForm1.IdTCPClient1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
        if AWorkMode = wmRead then begin
        Label6.Caption:=IntToStr(SizeOfIncomingStream);
        Label7.Caption:=IntToStr(AWorkCount);
        ProgressBar1.StepBy(AWorkCount);
        end;
        if AWorkMode = wmWrite then begin
        Label6.Caption:=IntToStr(SizeOfIncomingStream);
        Label7.Caption:=IntToStr(AWorkCount);
        ProgressBar1.StepBy(AWorkCount);
        end;
end;
Funktion funktioniert es nicht. AWorkMode und SizeOfIncomingStream sollten aber in dieser Funktion während der Übertragung angezeit werden. Wenn ich SizeOfIncomingStream direkt nach dem Ankommen der Dateigröße beim Empfänger der Datei abfrage funktioniert es. Sourecode der Funktion bei der es funktioniert:
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  fs: TFileStream;
begin
  if not SaveDialog1.Execute then exit;
  fs := TFileStream.Create(SaveDialog1.Filename, fmCreate or fmShareExclusive);
  with AThread.Connection do
    try
      SizeOfIncomingStream := ReadInteger;
      Label5.Caption:=IntToStr(SizeOfIncomingStream);
      ProgressBar1.Max := SizeOfIncomingStream;
      ReadStream(fs, SizeOfIncomingStream);
    finally
      Disconnect;
      fs.Free;
    end;
end;
Langsam habe ich das Gefühl, dass meine Funktion falsch ist.

Hoffe ihr könnt mir helfen

mfg
robertthronhill

ibp 26. Mai 2004 18:27

Re: Dateigröße auslesen
 
dann ist da doch das problem...

das du SizeOfIncomingStream dir nicht in

procedure TForm1.IdTCPClient1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer)

anzeigen lassen kannst ist klar da sie als lokale variable von

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);

definiert ist, sollte aber auch eine fehlermeldung gegeben haben!!!

wenn aber AWorkCount keine werte liefert, wie soll dann die progressbar was anzeigen ?

gruß rene

Stevie 27. Mai 2004 09:00

Re: Dateigröße auslesen
 
Außerdem:
1. Lass das mit dem OpenWriteBuffer weg, denn dann wird alles intern gebuffert und du bekommst nix davon im OnWork-Event mit.
2. Beim Lesen musst du einen TMemoryStream verwenden, ihn einlesen und erst dann den SaveDialog aufrufen und das Ding speichern.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls, ExtCtrls, IdTCPServer, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    chat: TMemo;
    cs: TClientSocket;
    Edit1: TEdit;
    IdTCPClient1: TIdTCPClient;
    IdTCPServer1: TIdTCPServer;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    LabeledEdit1: TLabeledEdit;
    OpenDialog1: TOpenDialog;
    ProgressBar1: TProgressBar;
    SaveDialog1: TSaveDialog;
    ss: TServerSocket;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure IdTCPClient1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  ip: string;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ip := LabeledEdit1.Text;
  cs.Host := ip;
  cs.Active := True;
  IdTCPClient1.Host := ip;
end;

procedure TForm1.Button3Click(Sender: TObject);
var msg: string;
begin
  msg := Edit1.Text;
  chat.Lines.Add(msg);
  cs.Socket.SendText(msg);
  Edit1.Text := '';
end;

procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
var rec: string;
begin
  rec := Socket.ReceiveText;
  if (rec = 'Server Message: Someone is pinging you') then
  begin
    chat.Lines.Add(rec);
    cs.Socket.SendText('Server Message: Ping successful. The chat-partner answered.');
  end
  else
    chat.Lines.Add(rec);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  cs.Socket.SendText('Server Message: Someone is pinging you');
  chat.Lines.Add('Server Message: Ping started');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  chat.Lines.Add('Server Message: Wellcome to MyChat 1.0');
  chat.Lines.Add('Server Message: Please enter your chat-partners ip in the field at the bottom of the');
  chat.Lines.Add('Server Message: programme and press connect.');
  chat.Lines.Add('Server Message: Then you can ping your chat-partner or send him/her a message.');
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  chat.Lines.Clear;
end;

procedure TForm1.Button6Click(Sender: TObject);
var
  fs: TFileStream;
begin
  if not OpenDialog1.Execute then exit;
  with IdTCPClient1 do
  begin
    fs := TFileStream.Create(OpenDialog1.FileName, fmShareDenyNone);
    Connect;
    try
//      OpenWriteBuffer;
      try
        ProgressBar1.Max := fs.Size;
        WriteInteger(fs.Size);
        WriteStream(fs, true, true);
//        CloseWriteBuffer;
      except
//        CancelWriteBuffer;
        raise;
      end;
    finally
      Disconnect;
      fs.Free;
    end;
  end;
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
//  fs: TFileStream;
  ms: TMemoryStream;
  SizeOfIncomingStream: integer;
begin
  ms := TMemoryStream.Create;
  with AThread.Connection do
  try
    SizeOfIncomingStream := ReadInteger;
//    fs := TFileStream.Create(SaveDialog1.Filename, fmCreate or fmShareExclusive);
//    ProgressBar1.Max := SizeOfIncomingStream;
    ReadStream(ms, SizeOfIncomingStream);
    if not SaveDialog1.Execute then exit;
    ms.SaveToFile(SaveDialog1.FileName);
  finally
    Disconnect;
    FreeAndNil(ms);
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  cs.Active := False;
  ss.Active := False;
  IdTCPServer1.Active := False;
end;

procedure TForm1.IdTCPClient1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  if AWorkMode = wmRead then
    ProgressBar1.StepBy(AWorkCount);
  if AWorkMode = wmWrite then
    ProgressBar1.StepBy(AWorkCount);
end;

end.
Das funktioniert auf jeden Fall!

Crimson 27. Mai 2004 12:34

Re: Dateigröße auslesen
 
Hi versuch mal den Befehl Size(<DATEINAME>)!

Matze 27. Mai 2004 12:37

Re: Dateigröße auslesen
 
Zitat:

Zitat von Crimson
Hi versuch mal den Befehl Size(<DATEINAME>)!

Hi!
Das müsste FileSize heißen, denke ich.

Das wurde aber hier schon angesprochen. ;)

robertthronhill 27. Mai 2004 14:58

Re: Dateigröße auslesen
 
Danke für die Hilfe Stevie! Eas funktioniert leider nicht.

@Crimson und Matze: Die Sache hab ich längst aufgegeben.

mfg
robertthronhill

robertthronhill 27. Mai 2004 15:37

Re: Dateigröße auslesen
 
Stevie hat es für mich zum Laufen gebracht.

Nochmal danke an alle die mir geholfen haben.

mfg
robertthronhill

Stevie 27. Mai 2004 15:38

Re: Dateigröße auslesen
 
Zitat:

Zitat von robertthronhill
Danke für die Hilfe Stevie! Eas funktioniert leider nicht.

Sorry, mein Fehler!! :wall:
Es muss nicht
Delphi-Quellcode:
ProgressBar.StepBy(AWorkCount);
heißen, sondern
Delphi-Quellcode:
ProgressBar.Position := AWorkCount;


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 Uhr.

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