Главная страница
    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.46 MB
Время: 0.041 c
14-1127816829
Agent13
2005-09-27 14:27
2005.10.16
Кто пользуется сетью MSN Messenger через Миранду, отзовитесь


14-1127549337
DiamondShark
2005-09-24 12:08
2005.10.16
Посоветуйте ньюс-сервер для чтения конференций relcom.


3-1125657938
Alex Kryuchkov
2005-09-02 14:45
2005.10.16
Транзакции в DBXpress


4-1124012368
NeoMaster
2005-08-14 13:39
2005.10.16
ReadDirectoryChagesW на все логичесике диски


1-1127464987
ZeroDivide
2005-09-23 12:43
2005.10.16
Проблема с оторбражением свойств в Инспекторе Объектов.





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