Главная страница
    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
1-1127472417
DelphiLexx
2005-09-23 14:46
2005.10.16
Соединение TImage линиями и их движение


6-1119460661
AlexWlad
2005-06-22 21:17
2005.10.16
Работа с почтой через Simple MAPI


2-1126169729
ГрэйМ
2005-09-08 12:55
2005.10.16
Реестр XP...


14-1127337530
Yorick_cool
2005-09-22 01:18
2005.10.16
Кафка-Замок


3-1125471061
Samozvanka
2005-08-31 10:51
2005.10.16
SQL запрос + порядковый номер записи в возвращённом результате.





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