Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

Скачка файла с интернета   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.038 c
14-1132583518
ArtemESC
2005-11-21 17:31
2005.12.11
Как програмно выключить или перезагрузить компьютер?


2-1133113159
Neosted
2005-11-27 20:39
2005.12.11
EXE файл


4-1128591108
Symbol
2005-10-06 13:31
2005.12.11
Ввод со звуковой карты


1-1131646175
Canvas
2005-11-10 21:09
2005.12.11
TCanvas для принтера


4-1123885355
Германн
2005-08-13 02:22
2005.12.11
"Безопасное извлечение устойства"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский