![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скачка файла с интернета
Dr.Nemo © (2005-08-26 15:00:00)Добрый день колеги у меня сложился вот такой вопрос
вот листинг моей программы:
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
Dr.Nemo (2005-08-31 18:51:00) [1]а как можно примерчик?
Pasha-rus (2005-08-27 10:08:00) [2]Да создай ты отделную функцию возвращающую true если файл скачен.И вызывай её уже в цикле!
Если файл большой, то лучше допеши докачку файла.
Dr.Nemo (2005-08-27 01:40:00) [3]Удалено модератором
Примечание: И закроем если будешь создавать пустые сообщения.
Dr.Nemo (2005-08-27 00:49:00) [4]Удалено модератором
Dr.Nemo (2005-08-26 18:41:00) [5]
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%
Digitman (2005-08-26 18:21:00) [6]
> если размер совпадёт со скаченным файлом
при ДАННОЙ реализации размер ты заранее знать не можешь : InternetReadFile() читает поток.
впрочем, можно попытаться перед первым вызовом InternetReadFile() определить размер потока вызовом InternetQueryDataAvailable()
скорей всего, это даст нужную инф-цию о размере потока.
Dr.Nemo (2005-08-26 18:17:00) [7]спасибо!, а Можно ли в программу вставить проверку размера скачиваемого файла? если да то как ? и если размер совпадёт со скаченным файлом то происходит true.ПОМОГИТЕ ПОЖАЛУЙСТА! ;-(
Digitman (2005-08-26 18:01:00) [8]while InternetReadFile(..) do
if BufferLen > 0 then
BlockWrite(..)
else
break;
end;
Dr.Nemo (2005-08-26 17:54:00) [9]Можно ли в программу вставить проверку размера скачиваемого файла? если да то как ? и если размер совпадёт со скаченным файлом то происходит true.ПОМОГИТЕ ПОЖАЛУЙСТА! ;-(
Digitman (2005-08-26 17:52:00) [10]
> Dr.Nemo (26.08.05 17:43) [13]
дело даже не в этом ..
ты почему-то игнорируешь рез-т, возвращаемый ф-цией HttpDownloadFile().
а ведь он информирует о факте успешного или неуспешного чтения очередного блока принимаемого файла !
неуспех вполне м.б. вызван разрывом коннекта с сервером в момент исполнения ф-ции HttpDownloadFile() или иными причинами ... ты же считаешь, что каждый вызов этой ф-ции обязательно приведет к успешному чтению блока в BufferLen байт
Dr.Nemo (2005-08-26 17:43:00) [11]Удалено модератором
Digitman (2005-08-26 17:36:00) [12]
> мне надо на чистом коде
где ты "грязь" увидел ?
> без подключения форм
где ты в этом "грязном" коде увидел подключение форм ?
> что в uses подключать
.. Windows, Messages, Classes ..
Dr.Nemo (2005-08-26 17:07:00) [13]но мне надо на чистом коде без подключения форм что в uses подключать?
Dr.Nemo (2005-08-26 16:53:00) [14]Удалено модератором
Примечание: Создание пустых сообщений
Fay (2005-08-26 16:50:00) [15]Блин, точно 8)
TTimer сам себе окошко создаёт.
А я и забыл (не каждый год пользуюсь).
Digitman (2005-08-26 16:41:00) [16]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.
Dr.Nemo (2005-08-26 15:54:00) [17]Удалено модератором
Примечание: Создание пустых сообщений
Fay (2005-08-26 15:45:00) [18]2 Dr.Nemo (26.08.05 15:39) [5]
Форма не нужна. Только виндо и SetTimet/KillTimer
Dr.Nemo (2005-08-26 15:39:00) [19]а можно ttimer вставить без формы потому что я хочу получить маленькиц размер
Digitman (2005-08-26 15:34:00) [20]заведи в программе таймер.
активируй его.
по тику таймера вызывай свою ф-цию.
если ф-ция выполнилась успешно, деактивируй таймер
и всех делов..