Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 126

/ вопрос открыт /

Здравствуйте! Для скачивания файла с сети использую wininet... подскажите почему при скачивании доходит до определённого места и всё! программа считает что файл скачан полностью... В чём дело? помогите пожалуйста!

eclipse Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: eclipse (статус: Посетитель)
Вопрос отправлен: 6 мая 2010, 21:06
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 21 мая 2010, 18:02; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 6 мая 2010, 21:49 [#1]:

Неплохо бы код увидеть.
Навскидку могут быть такие проблемы:
- прокси. имеют ограничения на размер скачиваемого файла либо же прокси один раз скачала неверно и отдает закешированный.
- опять прокси, но теперь другая причина - файл скачиваете слишком медленно...
- возможно скачивается совсем не то. к примеру, с некоторых файлообменников, если указать неверные куки, будет скачивается страница, а не сам файл. Откройте блокнотом, посмотрите.
Галочка "подтверждения прочтения" - вселенское зло.
eclipse

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

eclipse (статус: Посетитель), 6 мая 2010, 22:26 [#4]:

бляха-муха этот прокси все мозги вы... хрен знает чё надо!
eclipse

eclipse (статус: Посетитель), 14 мая 2010, 10:06 [#5]:

Мужики вот смотрите... в download master когда скачиваешь нек файлы полоса загрузки делится на несколько штук то есть идет не как обычно с лева на право , а с неск. точек... (надеюсь поняли). Я предполагаю что это идёт что-то вроде много поточности что ли или просто сервер даёт скачать файл предварительно разделив его по частям... Объясните пожалуйста что это конкретно и спомощью какой функции можно реализовать закачку таким типом через wininet (т.е. выше в функции). заранее спасибо!
eclipse

eclipse (статус: Посетитель), 14 мая 2010, 10:08 [#6]:

блин сразу забыл спросить ... при скачке файла примерно 100 килобайт не хватает в скачанном файле, НО! файл нормально работает... Что это может быть? или как с этим бороться или забить?
Вадим К

Вадим К (статус: Академик), 14 мая 2010, 10:25 [#7]:

Как это "не хватает"? или может быть размер оцениваете по тому, что показывает проводник? и забываете, что килобайт, это всё таки 1024 байта, а не 1000.
Галочка "подтверждения прочтения" - вселенское зло.
eclipse

eclipse (статус: Посетитель), 14 мая 2010, 18:00 [#8]:

Делал так : в программе делал вывод размера в 1 label , а во второй сколько скачалось.... так вот во 2 label ровно на 100 kb меньше и прогрессбар показывает 99 процентов???
bugmenot

bugmenot (статус: 3-ий класс), 20 мая 2010, 00:50 [#9]:

re: по частям - за это отвечают заголовок Content-Range и статус 206 Partial Content.
виконання програми розпочинається з того самого мiсця, де призупинилося.

eclipse

eclipse (статус: Посетитель), 21 мая 2010, 18:02 [#10]:

bugmenot а по подробней....

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:25
Выполнено за 0.02 сек.