Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.046 c
4-1128678334
Ботвин Дмитрий
2005-10-07 13:45
2005.12.11
Проблема с таймером


4-1128858993
ArtemESC
2005-10-09 15:56
2005.12.11
Создание панелей


14-1132161973
SPeller
2005-11-16 20:26
2005.12.11
Чайный гриб


5-1116572383
Priest
2005-05-20 10:59
2005.12.11
Как по PPropInfo получить полное имя свойства?


14-1132557356
Ega23
2005-11-21 10:15
2005.12.11
StarCraft еры, отзовитесь!