Avatar billede siz23 Nybegynder
13. april 2002 - 01:22 Der er 10 kommentarer og
2 løsninger

FileSize på en given URL:

hvordan finder jeg fil størelsen på en fil ud fra en URL?
nu har jeg stenet lidt over wininet api, og jeg tror godt det kan lade sig gøre med den, jeg er nok bare blevet for træt, også må man jo søge lidt hjælp fra de store eksperter ;)


jeg leder efter en fuction der ser ca. sådane ud

function GetFileSizeFromURL(URL:string):integer;
begin
    bla bla
end;

krav.

1.
der må ikke bruges componenter, kun windows/delphi API, samt dem der ellers følger med en standard windoze installation som fx. WININET

2.
det er ikke tilladt at downloaded filen for at se hvor stor den er.....

3.
den skal virke både med http of ftp, andre protocoler er lige meget.

4.
den skal retunere -1 hvis filen ikke eksistere.
(dette er ikke et krav, men ville værre meget rart)


p.s. et freeware component som kan overstående, kan også abseteres som et svar, men kun hvis der er fuld source med.

hvis det viser sig at værer en støre opgave vil jeg da godt give lidt flere points.
Avatar billede stoney Nybegynder
13. april 2002 - 02:03 #1
Jeg går ud fra du har Indy

http://www.tradestone.dk/eksperten/eks197469.zip

Stoney
Avatar billede siz23 Nybegynder
13. april 2002 - 02:27 #2
1. det var et component som der ikke er fuld source med til. Og nej jeg har faktisk ikke indy installeret lige nu ;(
men jeg installere det jo nok før eller siden, da der er mange gode componenter i ;)

2. virker ikke med ftp fx. ftp://bruger:test@192.168.1.4/readme.txt
ved overstående tilfælde kommer den med en socket 11001 error, og det går jo ikke ;(

men jeg er da lidt glad for at det ikke var så nemt, som at skive 2 linjer kode ;)  så var jeg godt nok blevet sur på mig selv.  ;)
Avatar billede dkn Nybegynder
13. april 2002 - 16:51 #3
Har lavet noget som virker nogle gang :)
Prøv det...
www.asdev.dk/Files/eks197469.zip
Avatar billede siz23 Nybegynder
13. april 2002 - 18:41 #4
ja den virker nogle gange;)
de små fejl der er med den, kunne jeg nok godt selv rette, men der er et langt støre problem.... der er IGEN brugt <2> indy componenter, Som jeg ikke kan få sourcen til. Det gør at jeg ikke kan bruge det til noget ;(

men blic endlig ved med at komme med forslag, jeg begynder også selv at kikke på det nu, for det må jo kunne lade sig gøre ;)
Avatar billede dkn Nybegynder
13. april 2002 - 18:46 #5
jeg brute ikke indy men NM - den er der heller ikke noget source med til. Men det var mere ideen jeg ville give dig
Avatar billede siz23 Nybegynder
13. april 2002 - 18:53 #6
hehe, det må du undskylde, kikkede kun lige din source igennem med notepad. ;)
ideer har jeg da også fået, hvis jeg så bare kan finde ud af at føre dem ud i livet ;)
så skal der nok falde nogle points af til dnk og Stoney, og hvem der ellers kommer med nogle godt forslag ;)
Avatar billede siz23 Nybegynder
14. april 2002 - 00:00 #7
når nu fandt jeg endlig en løsning ;)
men hvordan uploader jeg sourcen til eksperten så i andre kan se den?

og så lige et newbie spørgsmål omkring eksperten, hvordan uddeler jeg X antal point.

hvis jeg nu ville give dkn og stoney 50 points vær?
Avatar billede athlon-pascal Juniormester
14. april 2002 - 15:35 #8
Uploade source -> Hvis der ikke er for meget kode kan du kopiere den og indsætte (Ctrl + C) som kommentar.
Ellers skal du uploade den til en server.
Tilmeld dig F.eks. til http://www.fotx.net/ (personligt er jeg ikke medlem), der kan du uploade filer!

Pointfordeling -> For det første: få Stoney til at lave et nyt spørgsmål (det første er afvist).
Når spørgsmålet er oprettet skal du sørge for at være logget på Eksperten.
Gå ind i dette spørgsmål (hvis du ikke allerede er her).
Gå ned i bunden af siden og tryk på 'Avanceret'.
Vent.
Gå igen ned i bunden.
Nu har du mulighed for at fordele pointene.
Skriv 50 i de to felter og tryk på 'Accepter'.
Nu er pointene fordelt!
Avatar billede siz23 Nybegynder
14. april 2002 - 15:53 #9
hmmm... det kommer vist til at se lidt rodet ud hvis jeg bare paster kode herind, men nu prøver jeg aligevel.

stoney smid lige et svar mere, da det var din skyld, at jeg kom til at tænke på at size stod i header'en på en html fil ;)

hvis der er nogle der gerne vil vil have hele dette project, skal i værer velkommen til at kontakte mig på siz@post1.tele.dk.

jeg har godt nok ikke nogle "Avanceret" knap på bunden er min side, jeg har kun.

-->Som spørger har du nu følgende muligheder:
-->Accepter / Afvis svar fra :    dkn     
men jeg går ud fra, at det er fordi der kun er 1 svare.


når men nu til sovsen.

function DownloadURL(aUrl: string): Boolean;
  function CheckUrl(hInet:HINTERNET):integer;
  //returns 1 if no server is found, else status code
  var
      dwcode:array[1..20] of char;
      dwindex,dwcodelen :dword;
  begin
        Result:=1;  //error couln't contact server
        dwIndex := 0;
        dwCodeLen := 10;
        if HttpQueryInfo(hInet, HTTP_QUERY_STATUS_CODE, @dwcode, dwcodeLen, dwIndex) Then
        begin
            Result := integer(strtoint(PCHAR(@dwcode)));
        end;
  end;
  //get filesize from ftp
  function GetFTPFileSize(hInet:HINTERNET):cardinal;
  var
      dummy:DWORD;
  begin
        result:=FtpGetFileSize(hInet, @dummy);
  end;

  //get filesize from http
  function GetHTTPFileSize(hInet:HINTERNET):cardinal;
  var
      dwindex,dwcodelen :dword;
      dwcode:array[1..20] of char;
  Begin
        dwIndex := 0;
        dwCodeLen := 10;
        HttpQueryInfo(hInet, HTTP_QUERY_CONTENT_LENGTH, @dwcode,  dwcodeLen, dwIndex);
        Result := cardinal(strtoint(PCHAR(@dwcode)));
  end;

var
  hSession: HINTERNET;
  hService: HINTERNET;
  lpBuffer: array[0..4096 + 1] of Char;
  dwBytesRead: DWORD;
  StatusCode:integer;
  TotalRecieved:cardinal;
  FileSize:cardinal;
  Item:TListItem;
  I:integer;

begin
    result:=false;
    FileSize:=0;
    item:=nil;
    for i:=0 to Form1.Listview1.Items.Count-1 do
    begin
          if Form1.ListView1.Items.Item[i].SubItems.Strings[2]='0' then
          begin
              Item:=Form1.ListView1.Items.Item[i];
              break;
          end;
    End;
    if not assigned(item)
    Then Exit
    else aUrl:=Item.SubItems.Strings[0];
    Result := False;
    hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
    try
        if Assigned(hSession) then
        begin
            hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, INTERNET_FLAG_RELOAD, 0);
            if hService=nil Then
            Begin
                  Form1.Memo1.Lines.Add('error connecting to URL');
                  InternetCloseHandle(hService);
                  InternetCloseHandle(hSession);
                  exit;
            End;
            if lowercase(aUrl[1])='h' Then
            Begin
                  StatusCode:=CheckUrl(hService);
                  if ((StatusCode=200) or (StatusCode=302))
                  then FileSize:=GetHTTPFileSize(hService)
                  Else Form1.Memo1.Lines.Add('Status code='+StatusCodeToString(StatusCode)+' '+IntToStr(StatusCode));
            end;
        if lowercase(aUrl[1])='f'
        Then FileSize:=GetFTPFileSize(hService);
        //InternetCloseHandle(hService);
        //InternetCloseHandle(hSession);
        Item.SubItems.Insert(1, IntToStr(FileSize));
        TotalRecieved:=0;
        Form1.LastTotal:=0;
        Form1.TotalRecieved2:=0;
        Form1.Timer1.Enabled:=True;
        if Assigned(hService)
        then
            try
              while True do
              begin
                    dwBytesRead := 4096;
                    InternetReadFile(hService, @lpBuffer, 4096, dwBytesRead);
                    if dwBytesRead = 0 then break;
                    TotalRecieved:=TotalRecieved+dwBytesRead;
                    Form1.TotalRecieved2:=TotalRecieved;
                    lpBuffer[dwBytesRead] := #0;
                    Item.SubItems.Insert(2,IntToStr(Trunc(TotalRecieved/FileSize*100)));
                    Item.SubItems.Insert(4,IntToStr(TotalRecieved));
                    //Form1.Memo1.Lines.Add(lpBuffer);
                    Application.ProcessMessages;
              end;
              Result := True;
              Form1.Timer1.Enabled:=False;
            finally
                  InternetCloseHandle(hService);
            end;
    end;
    finally
            InternetCloseHandle(hSession);
    end;
end;
Avatar billede stoney Nybegynder
14. april 2002 - 17:53 #10
:-)

Stoney
Avatar billede kfz Nybegynder
26. juni 2007 - 02:09 #11
Jeg vil meget gerne have tilsendt fuld source af dit projekt.
har også smidt en mail til dig.
Avatar billede kfz Nybegynder
26. juni 2007 - 21:36 #12
du behøver ikke sende source alligevel, har fundet en anden løsning.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester