![]() |
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:
Um die Progressbar nun zum laufen zu bringen verwende ich folgende "Formel":
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;
Code:
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.
Progressbar.Position:=(erhalteneBytes*100)div gesammteBytes
2.Fall (Upload; man schickt jemandem eine Datei) Hierzu sieht mein Sourcecode so aus:
Delphi-Quellcode:
Dieses mal möchte ich wieder eine Progressbar haben, die anzeigt, wie weit der Upload ist. "Formel":
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;
Code:
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?
Progressbar.Postition:=(gesendeteBytes*100)div gesammteBytes
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 . |
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:
soviel dazu
if savedialod1.execute then
begin Filename:=Savedialog1.filename; end; dann sagst du was von dateigröße such ma in der oh... in unit sysutils glaub ich |
Re: Dateigröße auslesen
Guck dir mal das OnWork-Event an, das müsste dann ungefähr folgendermaßen aussehen:
Delphi-Quellcode:
Natürlich muss das noch erweitert werden, aber das ist sicherlich ein Ansatz...
procedure TForm1.IdTCPClient1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
begin ProgressBar.StepBy(AWorkCount); end; |
Re: Dateigröße auslesen
hi,
wegen der Dateigröße shau mal in der Delphi Hilfe unter FileSize nach! gruß rené |
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:
Ich bekomme nun, wenn ich das Programm compiliere den Fehler:
Progressbar1.Position :=(FileSize(SaveDialog1.Filename)*100)div SizeofIncomingStream;
Zitat:
Nochmal danke für die Hilfe mfg robertthronhill |
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 |
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; |
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?
|
Re: Dateigröße auslesen
Zitat:
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: |
Re: Dateigröße auslesen
wo steht ds denn, daß man keine Textdateien nehmen kann?:
Zitat:
|
Re: Dateigröße auslesen
Zitat:
|
Re: Dateigröße auslesen
@ibp: Ich habe Delphi6 Enterprise Edition und da steht noch eine Zeile extra:
Zitat:
Ich danke allen, die mir geholfen haben und denen, die mir noch helfen werden! mfg robertthronhill |
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; |
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:
Hoffentlich findet jemand meinen Fehler. Bin am verzweifeln :freak:
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. Danke für eurere Hilfe! mfg robertthronhill |
Re: Dateigröße auslesen
hallo,
das verstehe ich nicht.....
Delphi-Quellcode:
... du deklarierst: SizeOfIncomingStream: integer;
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; ... 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 |
Re: Dateigröße auslesen
Danke für den Tipp. Ich habs gleich ausprobiert, es funktioniert aber immernoch nicht.
mfg robertthronhill |
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! |
Re: Dateigröße auslesen
Ich habe versucht das ganze Anzeigen zu lassen. In dieser:
Delphi-Quellcode:
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:
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;
Delphi-Quellcode:
Langsam habe ich das Gefühl, dass meine Funktion falsch ist.
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; Hoffe ihr könnt mir helfen mfg robertthronhill |
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 |
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:
Das funktioniert auf jeden Fall!
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. |
Re: Dateigröße auslesen
Hi versuch mal den Befehl Size(<DATEINAME>)!
|
Re: Dateigröße auslesen
Zitat:
Das müsste FileSize heißen, denke ich. Das wurde aber ![]() |
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 |
Re: Dateigröße auslesen
Stevie hat es für mich zum Laufen gebracht.
Nochmal danke an alle die mir geholfen haben. mfg robertthronhill |
Re: Dateigröße auslesen
Zitat:
Es muss nicht
Delphi-Quellcode:
heißen, sondern
ProgressBar.StepBy(AWorkCount);
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