Текущий архив: 2005.12.11;
Скачать: CL | DM;
ВнизСкачка файла с интернета Найти похожие ветки
← →
Dr.Nemo (2005-08-26 15:00) [0]Добрый день колеги у меня сложился вот такой вопрос
вот листинг моей программы:
program Project3;
uses
wininet;
function HttpDownloadFile(URL, FileName: string): boolean;
const
BufferSize = 1024;
var
hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: longword;
f: file;
sAppName: string;
begin
Result := False;
//sAppName := "MyProgram";
hSession := InternetOpen(PChar(sAppName),
INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
hURL := InternetOpenURL(hSession, PChar(URL), nil, 0, 0, 0);
try
AssignFile(f, FileName);
Rewrite(f,1);
repeat
InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
BlockWrite(f, Buffer, BufferLen);
until
BufferLen = 0;
CloseFile(f);
Result := True;
finally
InternetCloseHandle(hURL);
end;
finally
InternetCloseHandle(hSession);
end;
end;
var FileOnNet, LocalFileName: string;
begin
FileOnNet:="http://localhost/1.exe";
LocalFileName:="1.exe";
if HttpDownloadFile(FileOnNet,LocalFileName)=True
then
/////////////////
else
////////////////////
end.
как в ету функцию вставить цикл
который например через каждые 5 минут
запускал скачку файла с интернета и если скачка прошла успешно то цикл останавливался
помогите пожалуйста а то у меня время поджимает!!
если можно то дайте примерчик или вышлите на smirnof@ua.fm
← →
Digitman © (2005-08-26 15:12) [1]
> как в ету функцию вставить цикл
функцию сначала довести до ума нужно, а уж потом про "циклы" рассуждать.
until BufferLen = 0;
..
Result := True;
с чего ты взял, что истинность условия BufferLen = 0 есть повод для принятия решения об УСПЕШНОМ "скачивании" файла ?
← →
Dr.Nemo (2005-08-26 15:18) [2]А всё таки как её зациклить с интервалом во времени?
← →
Плохиш © (2005-08-26 15:33) [3]TTimer к примеру
← →
Digitman © (2005-08-26 15:34) [4]заведи в программе таймер.
активируй его.
по тику таймера вызывай свою ф-цию.
если ф-ция выполнилась успешно, деактивируй таймер
и всех делов..
← →
Dr.Nemo (2005-08-26 15:39) [5]а можно ttimer вставить без формы потому что я хочу получить маленькиц размер
← →
Fay © (2005-08-26 15:45) [6]2 Dr.Nemo (26.08.05 15:39) [5]
Форма не нужна. Только виндо и SetTimet/KillTimer
← →
Dr.Nemo (2005-08-26 15:54) [7]Удалено модератором
Примечание: Создание пустых сообщений
← →
Digitman © (2005-08-26 16:41) [8]var
Timer: TTimer;
Method: TMethod;
Msg: TMsg;
procedure TimerProc(sender: TObject);
begin
if HttpDownloadFile(..) then
Timer.Active := False;
end;
..
begin
..
if not HttpDownloadFile(..) then
begin
Timer := TTimer.Create(nil);
try
Method.Code := @TimerProc;
Timer.OnTimer := TNotifyEvent(Method);
Timer.Period := 5000;
Timer.Active := True;
while Timer.Active and GetMessage(Msg, 0, 0, 0) do
DispatchMessage(Msg);
finally
Timer.Free;
end;
end;
...
end.
← →
Fay © (2005-08-26 16:50) [9]Блин, точно 8)
TTimer сам себе окошко создаёт.
А я и забыл (не каждый год пользуюсь).
← →
Dr.Nemo (2005-08-26 16:53) [10]Удалено модератором
Примечание: Создание пустых сообщений
← →
Dr.Nemo (2005-08-26 17:07) [11]но мне надо на чистом коде без подключения форм что в uses подключать?
← →
Digitman © (2005-08-26 17:36) [12]
> мне надо на чистом коде
где ты "грязь" увидел ?
> без подключения форм
где ты в этом "грязном" коде увидел подключение форм ?
> что в uses подключать
.. Windows, Messages, Classes ..
← →
Dr.Nemo (2005-08-26 17:43) [13]Удалено модератором
← →
Digitman © (2005-08-26 17:52) [14]
> Dr.Nemo (26.08.05 17:43) [13]
дело даже не в этом ..
ты почему-то игнорируешь рез-т, возвращаемый ф-цией HttpDownloadFile().
а ведь он информирует о факте успешного или неуспешного чтения очередного блока принимаемого файла !
неуспех вполне м.б. вызван разрывом коннекта с сервером в момент исполнения ф-ции HttpDownloadFile() или иными причинами ... ты же считаешь, что каждый вызов этой ф-ции обязательно приведет к успешному чтению блока в BufferLen байт
← →
Dr.Nemo (2005-08-26 17:54) [15]Можно ли в программу вставить проверку размера скачиваемого файла? если да то как ? и если размер совпадёт со скаченным файлом то происходит true.ПОМОГИТЕ ПОЖАЛУЙСТА! ;-(
← →
Digitman © (2005-08-26 18:01) [16]while InternetReadFile(..) do
if BufferLen > 0 then
BlockWrite(..)
else
break;
end;
← →
Dr.Nemo (2005-08-26 18:17) [17]спасибо!, а Можно ли в программу вставить проверку размера скачиваемого файла? если да то как ? и если размер совпадёт со скаченным файлом то происходит true.ПОМОГИТЕ ПОЖАЛУЙСТА! ;-(
← →
Digitman © (2005-08-26 18:21) [18]
> если размер совпадёт со скаченным файлом
при ДАННОЙ реализации размер ты заранее знать не можешь : InternetReadFile() читает поток.
впрочем, можно попытаться перед первым вызовом InternetReadFile() определить размер потока вызовом InternetQueryDataAvailable()
скорей всего, это даст нужную инф-цию о размере потока.
← →
Dr.Nemo (2005-08-26 18:41) [19]
program Project3;
uses
wininet,windows;
function HttpDownloadFile(URL, FileName: string): boolean;
const
BufferSize = 1024;
var
hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: longword;
f: file;
sAppName: string;
begin
Result := False;
hSession := InternetOpen(PChar(sAppName),
INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
hURL := InternetOpenURL(hSession, PChar(URL), nil, 0, 0, 0);
try
AssignFile(f, FileName);
Rewrite(f,1);
repeat
while InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen) do
if BufferLen > 0 then
BlockWrite(f, Buffer, BufferLen)
until
BufferLen = 0;
CloseFile(f);
Result := True;
finally
InternetCloseHandle(hURL);
end;
finally
InternetCloseHandle(hSession);
end;
end;
var FileOnNet, LocalFileName: string;
begin
FileOnNet:="http://localhost/1.avi";
LocalFileName:="c:\1.avi";
if HttpDownloadFile(FileOnNet,LocalFileName)=True then
WinExec("c:\1.avi",SW_SHOW);
end.
Может я не правильно вставил твой код?
потому что когда я прерываю загрузку проц загружен на 100%
← →
Dr.Nemo (2005-08-27 00:49) [20]Удалено модератором
← →
Dr.Nemo (2005-08-27 01:40) [21]Удалено модератором
Примечание: И закроем если будешь создавать пустые сообщения.
← →
Pasha-rus (2005-08-27 10:08) [22]Да создай ты отделную функцию возвращающую true если файл скачен.И вызывай её уже в цикле!
Если файл большой, то лучше допеши докачку файла.
← →
Dr.Nemo © (2005-08-31 18:51) [23]а как можно примерчик?
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.032 c