AGB  ·  Datenschutz  ·  Impressum  







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

Dateigröße auslesen

Ein Thema von robertthronhill · begonnen am 25. Mai 2004 · letzter Beitrag vom 27. Mai 2004
Antwort Antwort
Seite 1 von 3  1 23      
robertthronhill

Registriert seit: 19. Sep 2003
15 Beiträge
 
#1

Dateigröße auslesen

  Alt 25. Mai 2004, 16:47
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 .
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#2

Re: Dateigröße auslesen

  Alt 26. Mai 2004, 07:40
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
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

Re: Dateigröße auslesen

  Alt 26. Mai 2004, 08:13
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...
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#4

Re: Dateigröße auslesen

  Alt 26. Mai 2004, 08:34
hi,
wegen der Dateigröße shau mal in der Delphi Hilfe unter FileSize nach!

gruß rené
  Mit Zitat antworten Zitat
robertthronhill

Registriert seit: 19. Sep 2003
15 Beiträge
 
#5

Re: Dateigröße auslesen

  Alt 26. Mai 2004, 13:28
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:
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
  Mit Zitat antworten Zitat
s14

Registriert seit: 15. Mai 2003
Ort: München
251 Beiträge
 
Delphi 7 Architect
 
#6

Re: Dateigröße auslesen

  Alt 26. Mai 2004, 13:31
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
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#7

Re: Dateigröße auslesen

  Alt 26. Mai 2004, 13:38
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;
  Mit Zitat antworten Zitat
robertthronhill

Registriert seit: 19. Sep 2003
15 Beiträge
 
#8

Re: Dateigröße auslesen

  Alt 26. Mai 2004, 13:40
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?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

Re: Dateigröße auslesen

  Alt 26. Mai 2004, 13:42
Zitat von robertthronhill:
Muss ich das wirklich so machen, wie Stevie das gesagt hat?
Natürlich nicht!
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!
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#10

Re: Dateigröße auslesen

  Alt 26. Mai 2004, 13:43
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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:22 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