![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с докачкой не достающих фрагментов для битого файла [D5, D6, D7, Win2k, WinXP]
val_pov © (2005-06-24 16:27:00)Привет всем!!!
Нужна помощь.
Значит, надо выкачать (любыми методами/способами) из инета фрагменты
битого файла. Т.е. у меня есть битый вайл - допустим в нескольких местах,
и максимум битость - пару кил. Я нахожу все битые фрагменты (т.е. знаю
позицию в файле) - и знаю ссылку на файл в инете.
Теперь надо выкачать каждый фрагмент, без лишних расходов трафика (желательно),
и записать в файл на битые места.
Я уже всё сделал - только всё глючит, а имеено - выкачивание фрагментов.
глюки в следующем - как-то странно происходит смещение в инет файле, т.е.
вместо того чтобы выкачивать нужный фрагмент - прога умирает на месте
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); //<-|и файл
========================
val_pov (2005-06-24 17:05:00) [1]народ - вы хоть исходник смотрите...
InternetSetFilePointer(hURL,
ResumePos,
nil,
0,
0); // если докачиваем То сместимся
BiN (2005-06-24 16:49:00) [2]InternetSetFilePointer