Форум: "Сети";
Текущий архив: 2003.05.01;
Скачать: [xml.tar.bz2];
ВнизПомогите реализовать докачку файла по локальной сети Найти похожие ветки
← →
Diablo_al (2003-03-05 17:56) [0]Я мытался посимвольно копировать это получилось но очень медленно
файл размером в 600 метров копирует гдето час.
если кто-то делал подскажите как правильно
← →
Slym (2003-03-06 06:53) [1]Читай побуферно (4кб*i)... Быстрее будет...
← →
diablo_al (2003-03-06 12:42) [2]если есть примерчик поделись Плиз
← →
Anatoly Podgoretsky (2003-03-06 12:47) [3]Что то сетью, а какая она у тебя?
← →
Карелин Артем (2003-03-06 13:12) [4]Я не знаю что подразумевается под "копированием по сети" в данном случае, поэтому даю самый общий код по копированию файлов блоками.
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;
← →
Translator (2003-03-06 14:43) [5]Попробуй копировать не посимвольно, а целым стрингом.
Я писал прогу на паскале, аналогичную твоей (по-видимому). получается гораздо быстрее. Посимвольное копирование вообще очень тормозное, поэтому открой файл и копируй стриногом, причем не ограничивай длину, то есть CopyngData: String;
Может чем поможет...
← →
AlexRush (2003-03-06 20:28) [6]В HDD минимальная возможная для доступа единица информации - 1 кластер. Даже если ты читаешь 1 байт из фала, реально время тратится на считывание кластера. При чтении следующего байта HDD ждет, пока нужный кластер подойдет под головку чтенния (т.к он уже вышел из под нее), а если за это время произошло обращение к другому кластеру, то время тратится еще и на позиционирование головки. Таким образом, чтобы избежать холостого хода, читать нужно блоками, желательно кратными размеру кластера. Учитыва то, этиданные потом по сети толкаются, читать нужно небольшими блоками.
Если надо, пришлю рабочю прогу - некий примитивный аналог ReGet"a
для локалки. Очередь закачек + докачка. Интерфейс недоделан,кое где Exceptionы не прохендлены а в остальном работает. (Копирует файл небольшими блоками).
← →
Anatoly Podgoretsky (2003-03-06 20:30) [7]Обращение к следующему байту не приведет к повторному чтению кластера!
А вот то что он не хочет ничего сказать про свою сеть и как он читает это очень плохо, наверно ответ ему не нужен.
← →
AlexRush (2003-03-06 20:33) [8]Anatoly Podgoretsky >> "Обращение к следующему байту не приведет к повторному чтению кластера!"
Обоснуй пожалуйста.
← →
Anatoly Podgoretsky (2003-03-06 20:43) [9]Кластер/сектор загружается в буфер и в дальнейшем данные берутся из него
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.05.01;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c