Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.07.2011, 13:58   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию Как правильно написать функцию загрузки файлов из интернета..?

Доброго времени суток!

Пишу приложение сервис. Сервис обновляет файлы на ПК.

А т.к. это сервис, нужно чтобы он работал как надо.

Как правильно написать функцию загрузки файлов по http с проверкой, есть ли интернет и установлено ли соедениние?

Я пока что, это сделал вот так:
Код:
Function DownloadFile(aURL, SaveTo: string): boolean;
var
  http: TIdHTTP; // качало
  st: TMemoryStream; // приём-поток
begin
  http := TIdHTTP.Create(nil);
  http.ProtocolVersion:=pv1_1;
  http.HandleRedirects:=true;
  st := TMemoryStream.Create;
  try
    http.Get(aURL, st); // получаем
    If st.Size > 0 then
    begin
      st.SaveToFile(SaveTo);
      if FileExists(SaveTo) then
        Result := True
      else
        Result := False;
    end
    else
      Result := False;
  finally
    FreeAndNil(st);
    FreeAndNil(http);
  end;
end;
Как проверить, что нужный мне http сервер жив?

Если сервер прибит, то вылетает Socket Error connection refused.
Но ещё может вылететь что Connection reset by peer.

Кк избегать подобного?

Последний раз редактировалось Человек_Борща; 07.07.2011 в 14:06.
Человек_Борща вне форума Ответить с цитированием
Старый 07.07.2011, 14:27   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Почему бы try ... except не использовать?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.07.2011, 15:04   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Вариант Вечно все куда проще чем я представляю...
Код:
Function DownloadFile(aURL, SaveTo: string): boolean;
var
  http: TIdHTTP; // качало
  st: TMemoryStream; // приём-поток
begin
  http := TIdHTTP.Create(nil);
  http.ProtocolVersion := pv1_1;
  http.HandleRedirects := True;
  st := TMemoryStream.Create;
  try
    try
      http.Get(aURL, st); // получаем
    except
      Result := False;
    end;

    If st.Size > 0 then
    begin
      st.SaveToFile(SaveTo);
      if FileExists(SaveTo) then
        Result := True
      else
        Result := False;
    end
    else
      Result := False;
    /// сохраняем
  finally
    FreeAndNil(st);
    FreeAndNil(http);
  end;
end;
Человек_Борща вне форума Ответить с цитированием
Старый 07.07.2011, 15:11   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

st.SaveToFile(SaveTo); тоже может аварию вызвать, а если нормально завершилось то FileExists излишне
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 07.07.2011 в 15:15.
Аватар вне форума Ответить с цитированием
Старый 07.07.2011, 15:39   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

аварии не будет. т.к. поток сначало сохр. данные в файл. И только том уже проверка на наличие файла.
Человек_Борща вне форума Ответить с цитированием
Старый 07.07.2011, 16:15   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
аварии не будет. т.к. поток сначало сохр. данные в файл. И только том уже проверка на наличие файла.
Любое сохранение файла на диск может вызвать критическую ошибку, причина которой может быть в отсутствии полномочий на запись, отсутствии места на диске, сбойная дорожка, существование открытого файла с таким же именем в том же каталоге. А если уж SaveToFile отработал без ошибки, то проверка на существование - масло маслянное
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно объявить и определить функцию? -ushёl- Общие вопросы C/C++ 0 14.06.2010 13:30
как правильно написать функцию? -ushёl- Общие вопросы C/C++ 6 26.02.2010 20:11
Помогите плиз правильно написать макрос обновления данных из разных файлов Legame Microsoft Office Excel 10 10.09.2009 10:39
Как правильно описать функцию? аукшщ Общие вопросы C/C++ 2 19.01.2009 11:37
Как задать команду загрузки файлов данных на кнопку если каталог и имена файлов известны??? Andbuba Microsoft Office Excel 2 28.12.2008 17:28