Форум: "Сети";
Текущий архив: 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