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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2010, 13:31   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос WinInet докачка файла через TFileStream

Привет всем!

Как правельпо сделать докачку файлов?

вот что я сделал:
Код:
function HTTPGetFile(const FileURL,FileSaveDest:string;ShowProgress:Boolean):Boolean;
const
  BufferSize=1024;  //size of buffer
var
  hSession,hURL:HInternet;
  Buffer: array[0..BufferSize] of Byte;
  BufferLen:LongWord;
  Files:TFileStream;
  Header,pAppName:string;
begin
  Result:=False;
  pAppName:='AppProgram';
  Header:='User-Agent: AppProgram';
  hSession:=InternetOpen(PChar(pAppName),INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
  try
  hURL:=InternetOpenUrl(hSession,PChar(FileURL),PChar(Header),Length(header),INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD,0);
  if (hURL<>nil) then
  begin
  try
  DeleteUrlCacheEntry(PChar(FileURL));
  Files:=TFileStream.Create(FileSaveDest,fmCreate);
  repeat
    InternetReadFile(hURL,@Buffer, SizeOf(Buffer),BufferLen);
    Files.WriteBuffer(Buffer,BufferLen);
    if (ShowProgress) then
    begin
    LT:=LT+BufferLen;
    SendMessage(MainForm.Handle,PROGRESS,0,LT+BufferLen);
    end;
    until
    BufferLen= 0;
    FreeAndNil(Files);
    Result:=True;
    finally
      InternetCloseHandle(hURL);
      end;
      end;
     finally
     InternetCloseHandle(hSession);
  end;
  LT:=0;
  SendMessage(MainForm.Handle,PROGRESS,0,0);
end;
почитал вот это http://www.excode.ru/art1778p2.html

там описано как работать с file но как быть с TFileStream?
Человек_Борща вне форума Ответить с цитированием
Старый 03.08.2010, 13:57   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Наверное тебе поможет функция InternetSetFilePointer, только нужно запоминать место куда ею в файле перейти для докачки.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.08.2010, 02:39   #3
PVD
Пользователь
 
Аватар для PVD
 
Регистрация: 31.12.2009
Сообщений: 97
По умолчанию

А нет чего то по лучше чем InternetSetFilePointer, потому что когда устанавливается позиция для чтения, скачивается файл до позиции и лишь потом я могу продолжить скачивание, какой смысл такого докачивания если при таком же раскладе идентичным будет запустить скачивание заново?
PVD вне форума Ответить с цитированием
Старый 15.08.2010, 02:49   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

открыл сессию, и до чтения ставим указатель.
как с файлами.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.08.2010, 02:56   #5
PVD
Пользователь
 
Аватар для PVD
 
Регистрация: 31.12.2009
Сообщений: 97
По умолчанию

У меня так и реализовано
Код:
...
          Url:=InternetOpenUrl(Father,
          Pchar(SUrl),
          Pchar('Accept: */*'),
          11,
          0,
          0);
    WaitForSingleObject(Mutex,INFINITE);
    Filename:=User+'%'+FileNameFromUrl(SUrl);
    ReleaseMutex(Mutex);
    assignfile(f,Filename);
    arg3ind:=0;
    arg3len:=20;

    HttpQueryInfo(URL,HTTP_QUERY_CONTENT_LENGTH,@arg3,arg3len,arg3ind);
    NeedSize:=StrToInt(StrPas(@arg3));;

    if fileexists(Filename) Then
      Begin
      reset(f,1);
      Seek(F, FileSize(F));
      DataRead:=0;
      InternetSetFilePointer(Url,filesize(f),nil,0,0);
      DataLeft:=NeedSize-FileSize(F);
      End
    else
      Begin
      ReWrite(F,1);
      DataRead:=0;
      InternetSetFilePointer(Url,0,nil,0,0);
      DataLeft:=NeedSize;
      End;
...
PVD вне форума Ответить с цитированием
Старый 15.08.2010, 03:03   #6
PVD
Пользователь
 
Аватар для PVD
 
Регистрация: 31.12.2009
Сообщений: 97
По умолчанию

Или HttpQueryInfo(URL,HTTP_QUERY_CONTEN T_LENGTH,@arg3,arg3len,arg3ind); считается за чтение?
PVD вне форума Ответить с цитированием
Старый 15.08.2010, 03:38   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

это запрос информации о данных(HEAD), так что поидее нет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.08.2010, 03:46   #8
PVD
Пользователь
 
Аватар для PVD
 
Регистрация: 31.12.2009
Сообщений: 97
По умолчанию

Да проверил действительно от этого не зависит, а в чем может быть еще проблема?
PVD вне форума Ответить с цитированием
Старый 15.08.2010, 03:54   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а сервер поддерживает частичный GET?(она и дает докачку или распараллеливание)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.08.2010, 04:02   #10
PVD
Пользователь
 
Аватар для PVD
 
Регистрация: 31.12.2009
Сообщений: 97
По умолчанию

Сервер с которого пробую скачать ucoz, проверил в опере докачка нормально работает при скачивании от туда
PVD вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
скачка и докачка файла krok PHP 5 31.10.2009 22:22
Статья : Авторизация и аутентификация на сайтах, через WinInet Anatol_rus Обсуждение статей 2 23.10.2009 21:23
Хук HttpSendRequestA через Wininet.dll VitaliyK Общие вопросы .NET 0 08.12.2008 14:28
Подключение через WinInet SHEI'TI Работа с сетью в Delphi 1 15.02.2007 19:53