Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.16;
Скачать: CL | DM;

Вниз

Проблема с докачкой не достающих фрагментов для битого файла   Найти похожие ветки 

 
val_pov   (2005-06-24 16:27) [0]

Привет всем!!!
Нужна помощь.

Значит, надо выкачать (любыми методами/способами) из инета фрагменты
битого файла. Т.е. у меня есть битый вайл - допустим в нескольких местах,
и максимум битость - пару кил. Я нахожу все битые фрагменты (т.е. знаю
позицию в файле) - и знаю ссылку на файл в инете.
Теперь надо выкачать каждый фрагмент, без лишних расходов трафика (желательно),
и записать в файл на битые места.

Я уже всё сделал - только всё глючит, а имеено - выкачивание фрагментов.
глюки в следующем - как-то странно происходит смещение в инет файле, т.е.
вместо того чтобы выкачивать нужный фрагмент - прога умирает на месте

err := InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen); //Читаем буфер

и читает из инета этот файл - пока не дойдёт к нужному месту...
пробовал на разных серверах - они докачку поддерживают и скачку в несколько
потоков тоже.

может есть какойнить другой способ выкачать нужные фрагменты???

========================


var F : File;
   ResumePos, BufferLen : DWORD;
   hSession, hURL : HInternet;
   Buffer : array[1..1024] of Byte;
   err : boolean;
   i : Cardinal;
   n : Integer;
   Header : String;
   fSize : DWORD;
Label ex_1, ex_2, ex_3;
begin

   fSize := 0;
   AssignFile(F, LMDLabeledFileOpenEdit1.Filename);
   Reset(f, 1);

   NADO := TRUE; // надо качать
   //Открыли сессию
   hSession := InternetOpen("Mozilla",
                            PRE_CONFIG_INTERNET_ACCESS,
                            nil,
                            nil,
                            0);

   // bl, el - это список сегментов, начало и конец каждого сегмента.
   for i := 0 to bl.Count-1 do
   begin
     LMDLabel5.Caption := "Обработано сегментов = " + inttostr(i) + " из = " + inttostr(bl.Count);
     ResumePos := strtoint(bl.Strings[i])-1; //Откуда докачать
     
     // это колличество байт которые надо выкачать
     n := strtoint(el.Strings[i]) - strtoint(bl.Strings[i]);
     Seek(F, ResumePos);

     Header := "Accept: */*";
     //И наш УРЛ
     hURL := InternetOpenURL(hSession,
                             PChar(LMDLabeledEdit1.Text),
                             pchar(Header),
                             StrLen(pchar(Header)),
                             0,
                             INTERNET_FLAG_RELOAD);

     InternetSetFilePointer(hURL,
                            ResumePos,
                            nil,
                            0,
                            0); // если докачиваем То сместимся

     Application.Processmessages;

     REPEAT //Качаем
       if n > 0 then
       begin
         LMDLabel6.Caption := "Колличество байт из данного сегмента - " + inttostr(n);
         Application.Processmessages;

         err := InternetReadFile(hURL,
                                 @Buffer,
                                 SizeOf(Buffer),
                                 BufferLen); //Читаем буфер
         Application.Processmessages;

         IF err = false then //Ошибка чтения
         begin
           ShowMessage ("Произошел облом :(" + #13 + "Попробуйте снова..."); //Сообщим и выходим
           goto ex_3;
         end;
         BlockWrite(f, Buffer, BufferLen); //Пишем в файл
         dec(n, BufferLen);
         Application.Processmessages;
       end else goto ex_1;

     UNTIL (BufferLen = 0) Or (NADO = FALSE); //Качаем, пока не все или надо

ex_1:
     LMDLabel5.Caption := "Обработано сегментов = " + inttostr(i+1) + " из = " + inttostr(bl.Count);
     InternetCloseHandle(hURL);
     if nado = false then goto ex_2;
   end;
ex_2:
   ShowMessage ("Загрузка завершена!");
ex_3:
   InternetCloseHandle(hURL); //<-|закрываем
   InternetCloseHandle(hSession); //<-|сесcии
   CloseFile(f); //<-|и файл


========================


 
BiN ©   (2005-06-24 16:49) [1]

InternetSetFilePointer


 
val_pov   (2005-06-24 17:05) [2]

народ - вы хоть исходник смотрите...

    InternetSetFilePointer(hURL,
                           ResumePos,
                           nil,
                           0,
                           0); // если докачиваем То сместимся



Страницы: 1 вся ветка

Текущий архив: 2005.10.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
14-1127212706
pazitron_brain
2005-09-20 14:38
2005.10.16
шкс,


6-1119465288
bugman
2005-06-22 22:34
2005.10.16
UDP Redirect, port mapping, TidMappedPortUDP


2-1126723197
_root
2005-09-14 22:39
2005.10.16
Глобальная заморочка


14-1127426503
vimst
2005-09-23 02:01
2005.10.16
вопрос об процессе в виндах


3-1125564534
Sanich
2005-09-01 12:48
2005.10.16
Строки разного цвета в TDBGridEh. Поиск по TDBGridEh.