| 
| 
 | Вопрос # 4 126/ вопрос открыт / | 
 |  Здравствуйте! Для скачивания файла с сети использую wininet... подскажите почему при скачивании доходит до определённого места и всё! программа считает что файл скачан полностью... В чём дело? помогите пожалуйста! 
|  |   Вопрос задал: eclipse (статус: Посетитель)Вопрос отправлен: 6 мая 2010, 21:06
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 10; последнее сообщение — 21 мая 2010, 18:02; участников в обсуждении: 3. 
|   | Вадим К (статус: Академик), 6 мая 2010, 21:49 [#1]:Неплохо бы код увидеть. Навскидку могут быть такие проблемы:
 - прокси.  имеют ограничения на размер скачиваемого файла либо же прокси один раз скачала неверно и отдает закешированный.
 - опять прокси, но теперь другая причина - файл скачиваете слишком медленно...
 - возможно скачивается совсем не то. к примеру, с некоторых файлообменников, если указать неверные куки, будет скачивается страница, а не сам файл. Откройте блокнотом, посмотрите.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | eclipse (статус: Посетитель), 6 мая 2010, 21:59 [#2]:У меня прокси ... скорость до 40 к.бит/c ... часть брал у вас с сайта ну там видно будет : 
 unit Unit1;
 
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, WinInet, ComCtrls, ExtCtrls, SUIProgressBar;
 
 type
 TForm1 = class(TForm)
 edt1: TEdit;
 edt2: TEdit;
 btn1: TButton;
 btn2: TButton;
 lbl1: TLabel;
 lbl2: TLabel;
 pb1: TProgressBar;
 procedure FormCreate(Sender: TObject);
 procedure btn2Click(Sender: TObject);
 procedure btn1Click(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 procedure thrTerminate(Sender:TObject);
 end;
 
 var
 Form1: TForm1;
 stop: boolean;
 implementation
 
 {$R *.dfm}
 
 type
 TDownLoader = class(TThread)
 private
 protected
 procedure Execute;override;
 public
 end;
 
 function GetUrlInfo(dwInfoLevel: DWORD; FileURL: string): string;
 var
 hSession, hFile: hInternet;
 dwBuffer: Pointer;
 dwBufferLen, dwIndex: DWORD;
 begin
 Result := '';
 hSession := InternetOpen('eclipse Download',
 INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
 if Assigned(hSession) then
 begin
 hFile := InternetOpenURL(hSession, PChar(FileURL), nil, 0,
 INTERNET_FLAG_RELOAD, 0);
 dwIndex  := 0;
 dwBufferLen := 20;
 if HttpQueryInfo(hFile, dwInfoLevel, @dwBuffer, dwBufferLen, dwIndex)
 then Result := PChar(@dwBuffer);
 if Assigned(hFile) then InternetCloseHandle(hFile);
 InternetCloseHandle(hsession);
 end;
 end;
 
 procedure TDownLoader.Execute;
 var
 hInet, hURL: HINTERNET;
 fSize, ReadLen, RestartPos, Razmer_File: DWORD;
 fBuf: array[1..1024] of byte;
 f: file;
 Header: string;
 sizeinetfile: Integer;
 begin
 RestartPos := 0;
 fSize := 0;
 Form1.Btn1.Enabled := false;
 Form1.Btn2.Enabled := true;
 
 if FileExists(Form1.edt2.text) then
 begin
 AssignFile(f, Form1.edt2.text);
 Reset(f, 1);
 RestartPos := FileSize(F);
 Seek(F, FileSize(F));
 sizeinetfile:=strtoint(GetUrlInfo(HTTP_QUERY_CONTENT_LENGTH, Form1.edt1.text));
 Form1.lbl1.Caption:=IntToStr(sizeinetfile);
 end
 else
 begin
 AssignFile(f, Form1.edt2.text);
 ReWrite(f, 1);
 end;
 
 hInet := InternetOpen('eclipse', PRE_CONFIG_INTERNET_ACCESS, nil, nil, 0);
 Header := 'Accept: */*';
 hURL := InternetOpenURL(hInet, PChar(Form1.Edt1.Text), pchar(Header), StrLen(pchar(Header)), 0, 0);
 
 if RestartPos > 0 then InternetSetFilePointer(hURL,RestartPos,nil,0,0);
 InternetQueryDataAvailable(hURL, fSize, 0, 0);
 if RestartPos > 0 then
 begin
 Form1.pb1.Min := 0;
 Form1.pb1.Max := sizeinetfile;
 Form1.pb1.Position := FileSize(F);
 end
 else
 begin
 Form1.pb1.Min := 0;
 Form1.pb1.Max := FileSize(F);
 end;
 
 while (FileSize(F) < sizeinetfile) and (stop = false) do
 begin
 InternetReadFile(hURL, @fBuf, SizeOf(fBuf), ReadLen);
 InternetQueryDataAvailable(hURL, RestartPos, 0, 0);
 Form1.lbl2.Caption:=IntToStr(FileSize(F) div 1024);
 Form1.pb1.Position := Form1.pb1.Max - (sizeinetfile - FileSize(F));
 BlockWrite(f, fBuf, ReadLen); //<-пишем в файл
 Application.ProcessMessages;
 end;
 stop := false;
 Form1.Btn1.Enabled := true;
 Form1.Btn2.Enabled := false;
 InternetCloseHandle(hURL); //<-|закрываем
 InternetCloseHandle(hInet); //<-|сесcии
 CloseFile(f); //<-|и файл
 end;
 
 
 procedure TForm1.FormCreate(Sender: TObject);
 begin
 stop := false; //<-прервать скачку
 Btn2.Enabled := false; //<-кнопка останова скачки
 end;
 
 procedure TForm1.btn2Click(Sender: TObject);
 begin
 stop := true; //<-сообщаем о необходимости прерывания скачки
 end;
 
 procedure TForm1.btn1Click(Sender: TObject);
 var d:TDownLoader;
 begin
 //Создадим класс потока.
 //Поток для начала будет остановлен
 d:=TDownLoader.Create(true);
 //Передадим параметры потоку
 //Поток должен удалить себя по завершению своей работы
 d.FreeOnTerminate:=true;
 d.OnTerminate:=thrTerminate;
 //И запустим его на закачку.
 d.Resume;
 //Теперь с процедуры мы выйдем, но поток работает
 //и живёт своей жизней
 end;
 
 procedure TForm1.thrTerminate(Sender: TObject);
 begin
 ShowMessage('Готово');
 end;
 
 end.
 |  
|   | Вадим К (статус: Академик), 6 мая 2010, 22:13 [#3]:попробуйте увеличить буфер в этой строке fBuf: array[1..1024] of byte;
 например до 4*1024 или даже 16*1024
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | eclipse (статус: Посетитель), 6 мая 2010, 22:26 [#4]:бляха-муха этот прокси все мозги вы... хрен знает чё надо! |  
|   | eclipse (статус: Посетитель), 14 мая 2010, 10:06 [#5]:Мужики вот смотрите... в download master когда скачиваешь нек файлы полоса загрузки делится на несколько штук то есть идет не как обычно с лева на право , а с неск. точек... (надеюсь поняли). Я предполагаю что это идёт что-то вроде много поточности что ли или просто сервер даёт скачать файл предварительно разделив его по частям... Объясните пожалуйста что это конкретно и спомощью какой функции можно реализовать закачку таким типом через wininet (т.е. выше в функции). заранее спасибо! |  
|   | eclipse (статус: Посетитель), 14 мая 2010, 10:08 [#6]:блин сразу забыл спросить ... при скачке файла примерно 100 килобайт не хватает в скачанном файле, НО! файл нормально работает... Что это может быть? или как с этим бороться или забить? |  
|   | Вадим К (статус: Академик), 14 мая 2010, 10:25 [#7]:Как это "не хватает"? или может быть размер оцениваете по тому, что показывает проводник? и забываете, что килобайт, это всё таки 1024 байта, а не 1000. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | eclipse (статус: Посетитель), 14 мая 2010, 18:00 [#8]:Делал так : в программе делал вывод размера в 1 label , а во второй сколько скачалось.... так вот во 2 label ровно на 100 kb меньше и прогрессбар показывает 99 процентов??? |  
|   | bugmenot (статус: 3-ий класс), 20 мая 2010, 00:50 [#9]:re: по частям - за это отвечают заголовок Content-Range и статус 206 Partial Content. виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | eclipse (статус: Посетитель), 21 мая 2010, 18:02 [#10]:bugmenot а по подробней.... |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |