Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Скачка файла с интернета


Страницы:   1 2

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]

заведи в программе таймер.
активируй его.
по тику таймера вызывай свою ф-цию.
если ф-ция выполнилась успешно, деактивируй таймер

и всех делов..


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо