Autor |
Beitrag |
DeCodeGuru
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: Sa 07.09.02 15:24
Hi leute,
wie kann ich die Größe einer Datei, die auf einem HTTP-Server liegt, bestimmen?
_________________ Viele Grüße
Jakob
|
|
bis11
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: Sa 07.09.02 15:37
Hi,
vielleicht kannst Du ja damit etwas anfangen, da ist zumindest der Ansatz drin wie ich die Größe einer Datei erkenne.
www.swissdelphicente.../showcode.php?id=330
|
|
DeCodeGuru
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: Sa 07.09.02 15:51
super, danke
_________________ Viele Grüße
Jakob
|
|
DeCodeGuru
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: Mo 09.09.02 20:21
ooops, da war ich wohl etwas zu glücklich, dass ich eine antwort bekommen habe. nun ein problem: Die Quellcodes die auf der Seite stehen können nur mit lokalen Dateien funktionieren. Ich möchte aber die größe einer Datei (z.B. www.google.de/wasweissich/irgendwas.zip) herausfinden. Solche Dateien sind halt nicht auf der lokalen Festplatte.
_________________ Viele Grüße
Jakob
|
|
M4EiB
Beiträge: 41
|
Verfasst: Di 10.09.02 01:03
die länge einer datei steht im http-header unter "Content-Length".
aufrufen tust du es am besten mit dem befehl "head". erfordert nur den http-header als antwort, bei einem normalen get würde die datei auchmitgeschickt (falls du sie sowieso downloaden willst ist das natürlich zu bevorzugen).
hier code mit der indy-http-komponente:
Quelltext 1: 2:
| idhttp1.Head('http://home.t-online.de/home/0724721978-0001/hlsw_0_4_2b_setup.exe'); memo1.lines.add(inttostr(idhttp1.Response.contentlength)); |
sollte auch mit nmhttp1 gehen. dazu musst du aber die contentlength aus dem header auslesen.(wüsste nicht, dass man sie direkt auslesen kann)
|
|
DeCodeGuru
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: Di 10.09.02 10:57
hi M4EiB,
ich habs mir schon gedacht, dass das alles im Header stehen muss. Ich wollte heute eigentlich einen Http-Server schreiben, dann die Proxyeinstellungen des Browser auf meinen Server stellen und schauen, was da für Befehle ankommen. Na ja, halt keinen richtigen Server. Aber vielen Dank, hast mir ein schönes Stück Arbeit erspart.
Achja, wenn wir grade beim Thema sind und du dich so gut auskennst *gg*. Wie kann ich überprüfen, ob die Datei überhaupt verfügbar ist, also ob das nicht nur ein Fake ist?
_________________ Viele Grüße
Jakob
|
|
M4EiB
Beiträge: 41
|
Verfasst: Mi 11.09.02 06:32
hi
entweder gibts einen timeout. wenn der server gar nichts schickt.
falls er aber eine seite schickt, in der steht, dass die datei nicht existiert oder im moment nicht verfügbar ist. kannst du im header den eintrag "content-type" anschauen: bei html dateien steht da auch "Content-type: text/html". falls man eine text- html-datei download will, funzt das aber nicht.
|
|
DeCodeGuru
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: Mi 11.09.02 14:53
so, ich habe jetzt ein bisschen in der PSDK gestöbert und habe mir dann nen Quuellcode erstellt, der zwar funtzt aber unendlich lahm ist. Wenn mir einer sagen könnte, was ich noch beschleunigen könnte, da wäre ich echt dankbar. So hier, ist mal der Code.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, activex, urlmon;
type TForm1 = class(TForm) Edit1: TEdit; Label1: TLabel; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end;
type cDownloadStatusCallback = class(TObject,IUnknown,IBindStatusCallback) private function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall; function GetPriority(out nPriority): HResult; stdcall; function OnLowResource(reserved: DWORD): HResult; stdcall; function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult; stdcall; function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall; function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall; function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc; stgmed: PStgMedium): HResult; stdcall; function OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall; end;
var Form1: TForm1;
implementation
{$R *.dfm}
//IUnknown interface
function cDownloadStatusCallback._AddRef: Integer; begin Result := 0; end;
function cDownloadStatusCallback._Release: Integer; begin Result := 0; end;
function cDownloadStatusCallback.QueryInterface(const IID: TGUID; out Obj): HResult; begin if(GetInterface(IID,Obj)) then begin Result := 0 end else begin Result := E_NOINTERFACE; end; end;
// IBindStatusCallback interface
function cDownloadStatusCallback.OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; begin Result := S_OK; end;
function cDownloadStatusCallback.GetPriority(out nPriority): HResult; begin Result := S_OK; end;
function cDownloadStatusCallback.OnLowResource(reserved: DWORD): HResult; begin Result := S_OK; end;
function cDownloadStatusCallback.OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall; begin Result := S_OK; end;
function cDownloadStatusCallback.GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall; begin Result := S_OK; end;
function cDownloadStatusCallback.OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc; stgmed: PStgMedium): HResult; begin Result := S_OK; end;
function cDownloadStatusCallback.OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall; begin Result := S_OK; end;
function cDownloadStatusCallback.OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult; begin case ulStatusCode of BINDSTATUS_FINDINGRESOURCE: begin Form1.Label1.Caption := 'Datei existiert'; Result := E_ABORT; exit; end; end; //Nur so zum Aktualisierungszweck Application.ProcessMessages;
Result := S_OK; end;
procedure TForm1.Button1Click(Sender: TObject); var cDown: CDownloadstatuscallback; begin Label1.Caption := 'Datei existiert nicht'; cDown := cDownloadStatusCallback.Create; URLDownloadToFile(nil,PChar(Edit1.Text),PChar('C:\Test.tmp'),0,cDown); end;
end. |
Also, wäre echt super, wenn jemand das ganze beschleunigen könnte. Mir fiel bis jetzt nichts auf.
_________________ Viele Grüße
Jakob
|
|
Steffer
Beiträge: 299
|
Verfasst: Mi 11.09.02 17:53
_________________ Keine Signatur ...
|
|
DeCodeGuru
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: Mi 11.09.02 19:16
hey, danke. Werde das morgen mal ausprobieren.
_________________ Viele Grüße
Jakob
|
|