Главная страница
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.044 c
8-1116500972
poo
2005-05-19 15:09
2005.10.16
воспроизведение wave


2-1126642440
markon
2005-09-14 00:14
2005.10.16
Вызов функции, написанной в одном модуле из другого модуля


1-1127887104
OlegM
2005-09-28 09:58
2005.10.16
Не происходит смена курсора


3-1125500254
Ramil
2005-08-31 18:57
2005.10.16
где прописывают пользователей с доступом к базам


2-1126124119
bogdan
2005-09-08 00:15
2005.10.16
полный путь к файлу на диске