Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> InternetOpenURL закачивает файл из локального кэша 
V
    Опции темы
Romero
Дата 15.2.2008, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.6.2005

Репутация: нет
Всего: 1



Использую для закачки файлов из Инета (FTP, HTTP) функцию InternetOpenURL.
Столкнулся с проблемой закачивания этой функцией файла из локального кэша. По-крайней мере, это единственное мое объяснение происходящего.
Суть в следующем: успешно закачал определенный файл с FTP-сервера, затем изменил его на серваке и попытался закачать снова - получил старый (до изменения). Прокси отключен, IE качает с сервера правильную копию файла.
Вопрос: правильно ли я грешу на локальное кэширование и как этого избежать?
PM   Вверх
greenpc
Дата 15.2.2008, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 29.1.2007

Репутация: нет
Всего: нет



посмотри флаги
INTERNET_FLAG_PRAGMA_NOCACHE
INTERNET_FLAG_RELOAD

PM   Вверх
Romero
Дата 15.2.2008, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.6.2005

Репутация: нет
Всего: 1



Решил при помощи установки флагов
INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE
в функции
InternetOpenURL.

Если вдруг кому понадобится рабочий код (на гениальность не претендую  smile ):
Код

//собственно, функция для закачки файла и сохранения на диск
function GetInetFile(const FileURL,FileName:string):boolean;
const
  BufferSize=1024;
var
  hSession,hURL:HInternet;
  Buffer:array[1..BufferSize] of Byte;
  BufferLen:DWORD;
  f:File;
  sAppName:string;
begin
  Result:=False;
  sAppName:='Downloader';
  hSession:=InternetOpen(PChar(sAppName),INTERNET_OPEN_TYPE_PRECONFIG,
    nil,nil,0);
  try
    hURL:=InternetOpenURL(hSession,PChar(FileURL),nil,0,
      INTERNET_FLAG_RELOAD or INTERNET_FLAG_DONT_CACHE,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;

//здесь я вызываю GetInetFile, указывая URL и путь к файлу на диске, и обрабатываю файл после этого (например, считаю CRC32
procedure ThreadFunc;stdcall;
begin
  try
    if GetInetFile(FileURL,FileName) then
      //...
    else
      //...
  except
    //...
  end;
end;

//вызов произвожу в отдельном потоке, задавая таймаут его жизни в переменной TimeOut
  hThread:=CreateThread(nil,0,@ThreadFunc,nil,0,ThID);
  if WaitForSingleObject(hThread,TimeOut)=WAIT_TIMEOUT then
    //... (если истек таймаут)
  CloseHandle(hThread);

PM   Вверх
vovksextra
Дата 15.2.2008, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Код приятный - но если файлик большой и канал тонкий - то приложение не получит управления до момента получения файлика.

Я столкнулся с такой проблемой при разработке приложения, которое само себя обновляет.

Даю ссылку на программулину, в которой есть очень много вкусностей.

1. Автообновление экзешника по http (тихое - незаметное для пользователя)
2. Удаленное получение инфы (много всяких интересностей) от абонента по UDP протоколу (без indy)

Вообщем очень долго расписывать - кому интересно могут ознакомится с кодом здесь ))

http://local.com.ua/forum/index.php?showtopic=10048&st=0


вообщем смотрим и делимся идеями


PS

Я здесь новичек (и не только здесь) и не заметил что на форуме есть пользователь Rouse. Приятно иногда посещать его сайтик. Спасибо за труд твой )). 


  



Это сообщение отредактировал(а) vovksextra - 15.2.2008, 12:41
PM MAIL   Вверх
Romero
Дата 15.2.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.6.2005

Репутация: нет
Всего: 1



Мое приложение служит для закачки файла по переданному из командной строки URL и выполнения действий ПОСЛЕ закачки, поэтому твое замечание не очень актуально  smile 

З.Ы.: Для ограничения времени на попытку подключения/закачку намеренно использовал не SetOption, а WaitForSingleObject, ибо первый механизм не работает (об этом даже на статью в MSDN натыкался).

Это сообщение отредактировал(а) Romero - 15.2.2008, 16:44
PM   Вверх
vovksextra
Дата 15.2.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(Romero @ 15.2.2008,  16:27)
Мое приложение служит для закачки файла по переданному из командной строки URL и выполнения действий ПОСЛЕ закачки, поэтому твое замечание не очень актуально  smile 

Если ты скачал проект - то мог увидеть модуль UpdateApplicationUnit

в котором реализован целый класс, который делает тоже самое. )))))))))))


 TDownLoadURL

Пример использования класса (вырезка)

Код


 P: TDownLoadURL;
begin
 
  P := TDownLoadURL.Create;
 
  try

    Path := ExtractFilePath(ParamStr(0));

    P.URL := 'http://10.10.1.204/inetaccess/';
    P.Source := 'update.ver';
    P.Dest := Path + P.Source;

    log('получаем файл update.ver');

    P.GetFile;

    if not P.Status then
      exit;

    log('успешно получили update.ver');




Обрати внимание на метод GetFile 


вот вырезка из описания метода

Код

procedure TDownLoadURL.GetFile;
var
  Msg: TMsg;
  PStatus: PBoolean;
begin
  if not Assigned(FThread) then
  begin
    PStatus := @FStatus;
    FThread := TDownLoadURLThread.Create(FURL, FSource, FDest, PStatus);
    FThread.OnTerminate := ThreadDone;
    while Assigned(FThread) do
      while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
  end
  else
    FStatus := False;
end; 


Обрати внимание на 

while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);


вот впрочем то что я хотел сказать в своем предыдущем посте .



Комментарий нужен ? Или сам поймешь ?

PS
И еще я не хочу вступать в диалог чей код лучше а чей хуже, со временем сам поймешь что это глупо.
Я просто предложил еще один вариант.

спасибо.








Это сообщение отредактировал(а) vovksextra - 15.2.2008, 18:33
PM MAIL   Вверх
Romero
Дата 5.3.2008, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.6.2005

Репутация: нет
Всего: 1



Я и не собирался спорить по качественности подхода, мне избавляться от подвисания не нужно - потому и написал, что не актуально. В твоем коде все понятно, комментарии не нужны.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.