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

Вниз

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

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

Наверх





Память: 0.47 MB
Время: 0.036 c
2-1126843465
Meine
2005-09-16 08:04
2005.10.16
DBGrid


14-1127685955
Германн
2005-09-26 02:05
2005.10.16
Анимация окна


14-1127748542
Карелин Артем
2005-09-26 19:29
2005.10.16
Вот и база жителей РФ!


8-1116948602
Dadly
2005-05-24 19:30
2005.10.16
Перевод аналогового звука через вход карты в цифровой


1-1127725727
Alex.Ru
2005-09-26 13:08
2005.10.16
Странный глюк в проекте CLX





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский