|
Вопрос # 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 а по подробней....
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|