![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите реализовать докачку файла по локальной сети [D5, D6, D7, Win95/98, Win2k, WinXP]
Diablo_al © (2003-03-05 17:56:00)Я мытался посимвольно копировать это получилось но очень медленно
файл размером в 600 метров копирует гдето час.
если кто-то делал подскажите как правильно
Anatoly Podgoretsky (2003-03-06 20:43:00) [1]Кластер/сектор загружается в буфер и в дальнейшем данные берутся из него
AlexRush (2003-03-06 20:33:00) [2]Anatoly Podgoretsky >> "Обращение к следующему байту не приведет к повторному чтению кластера!"
Обоснуй пожалуйста.
Anatoly Podgoretsky (2003-03-06 20:30:00) [3]Обращение к следующему байту не приведет к повторному чтению кластера!
А вот то что он не хочет ничего сказать про свою сеть и как он читает это очень плохо, наверно ответ ему не нужен.
AlexRush (2003-03-06 20:28:00) [4]В HDD минимальная возможная для доступа единица информации - 1 кластер. Даже если ты читаешь 1 байт из фала, реально время тратится на считывание кластера. При чтении следующего байта HDD ждет, пока нужный кластер подойдет под головку чтенния (т.к он уже вышел из под нее), а если за это время произошло обращение к другому кластеру, то время тратится еще и на позиционирование головки. Таким образом, чтобы избежать холостого хода, читать нужно блоками, желательно кратными размеру кластера. Учитыва то, этиданные потом по сети толкаются, читать нужно небольшими блоками.
Если надо, пришлю рабочю прогу - некий примитивный аналог ReGet"a
для локалки. Очередь закачек + докачка. Интерфейс недоделан,кое где Exceptionы не прохендлены а в остальном работает. (Копирует файл небольшими блоками).
Translator (2003-03-06 14:43:00) [5]Попробуй копировать не посимвольно, а целым стрингом.
Я писал прогу на паскале, аналогичную твоей (по-видимому). получается гораздо быстрее. Посимвольное копирование вообще очень тормозное, поэтому открой файл и копируй стриногом, причем не ограничивай длину, то есть CopyngData: String;
Может чем поможет...
Карелин Артем (2003-03-06 13:12:00) [6]Я не знаю что подразумевается под "копированием по сети" в данном случае, поэтому даю самый общий код по копированию файлов блоками.
procedure TForm1.Button1Click(Sender: TObject);
var st1,st2:TFileStream;
st3:TMemoryStream;
i,BlockSize,BlockNum:Integer;
begin
BlockSize:=$FFFF;
st1:=TFileStream.Create(FilenameEdit1.FileName,fmOpenRead);
st2:=TFileStream.Create(FilenameEdit2.FileName,fmCreate);
st3:=TMemoryStream.Create;
st1.Position:=0;
BlockNum:=st1.Size div BlockSize;
ProgressBar1.Max:=BlockNum;
for i:=0 to BlockNum-1 do
begin
st3.Clear;
ProgressBar1.Position:=i;
Application.ProcessMessages;
st3.CopyFrom(st1,BlockSize);
st3.SaveToStream(st2);
end;
st3.CopyFrom(st1,st1.Size-st1.Position);
st3.SaveToStream(st2);
ProgressBar1.Position:=0;
st1.Free;
st2.Free;
st3.Free;
end;
Anatoly Podgoretsky (2003-03-06 12:47:00) [7]Что то сетью, а какая она у тебя?
diablo_al (2003-03-06 12:42:00) [8]если есть примерчик поделись Плиз
Slym (2003-03-06 06:53:00) [9]Читай побуферно (4кб*i)... Быстрее будет...