Форум: "Сети";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
Вниздокачка файла после обрыва связи в локальной сети Найти похожие ветки
← →
Равиль (2002-09-27 01:20) [0]Необходима возможность закачивать файл из расшаренных ресурсов локальной сети с возможность докачки после обрыва связи.
Если поможете, хотя бы идеей, буду очень признателен.
Со многими благодарностями, Равиль
grav20@mail.ru
← →
Rouse_ (2002-09-27 02:00) [1]Процедура копирует файл, при обрыве возвращает колво скопированных байт
При закачке возвращает (-6)
function CopyFileExt(Source, Dectination:String; Start:LongInt; Style:Byte): Longint;
var
ToF: File;
FromF:Integer;
NumRead, NumWritten:Longint;
Buf: array[1..2048] of Char;
SendResult:Integer;
Ends:Boolean;
tmpD,d: String;
begin
tmpD:= Dectination;
Source:= AnsiUpperCase(Source);
Dectination:= AnsiUpperCase(Dectination);
if Source = "" then begin
Result := -1;
Exit;
end;
if Dectination = "" then begin
Result := -2;
Exit;
end;
if Start < 0 then begin
Result := -3;
Exit;
end;
if Source = Dectination then begin
Result := -4;
Exit;
end;
if DirectoryExists(Source) then begin
Result := -10;
Exit;
end else begin
d:=ExtractFileName(Source);
if (d=".") or (d="..") then begin
Result := -10;
Exit;
end;
end;
if FileExists(Source) then begin
FromF:=FileOpen(Source,fmOpenRead);
if FromF = -1 then begin
Result := -8;
Exit;
end;
LenFile := FileSeek(FromF,0,2);
if Start >= LenFile then begin
Result := -3;
if FromF >= 0 then FileClose(FromF);
Exit;
end;
FileSeek(FromF,Start,0);
end else begin
Result := -5;
if FromF>=0 then FileClose(FromF);
Exit;
end;
if Start = 0 then begin
d:= copy(ExtractFilePath(Source),Length(RootDir)+1,Length(Source));
if Length(d)=0 then d:= "\" else
if d[1]<>"\" then d:= "\"+d;
tmpD:= tmpD+d;
ForceDirectories(tmpD);
tmpD := tmpD +ExtractFileName(Source);
if FileExists(tmpD) then
case Style of
1: begin
Result := -9;
if FromF>=0 then FileClose(FromF);
Exit;
end;
3: begin
tmpD:= ExtractFilePath(tmpD)+"Copy of "+ExtractFileName(tmpD);
end;
end;
AssignFile(ToF,tmpD);
Rewrite(ToF,1);
end else begin
d:= copy(ExtractFilePath(Source),Length(RootDir)+1,Length(Source));
if Length(d)=0 then d:= "\" else
if d[1]<>"\" then d:= "\"+d;
tmpD:= tmpD+d;
ForceDirectories(tmpD);
tmpD := tmpD +ExtractFileName(Source);
if FileExists(tmpD) then begin
AssignFile(ToF,tmpD);
Reset(ToF,1);
if Start > FileSize(ToF) then begin
Result := -3;
if FromF>=0 then FileClose(FromF);
CloseFile(ToF);
Exit;
end;
Seek(ToF,Start);
end else begin
Result := -7;
if FromF>=0 then FileClose(FromF);
Exit;
end;
end;
StopBit := CurrentLength;
SendResult := FullLength div 100;
Result := Start;
repeat
{$I-}
NumRead:= FileRead(FromF, Buf, SizeOf(Buf));
BlockWrite(ToF, Buf, NumRead, NumWritten);
Application.ProcessMessages;
{$I+}
if IOResult = 0 then begin
inc(CurrentLength, NumWritten);
inc(StopBit, NumWritten);
inc(Result, NumWritten);
end;
if (IOResult = 0) and (StopBit >= SendResult) then begin
StopBit := 0;
pgProgress.Position := CurrentLength;
pgProgress.Refresh;
end;
until (IOResult <> 0) or (NumRead=0) or (not CanCopy) or (NumRead=-1);
if Result = LenFile then Result := -6;
try
FileClose(FromF);
CloseFile(ToF);
except end;
end;
Желаю успехов
← →
Граф (2002-09-30 05:09) [2]Здесь есть 2 проблемы:
1. Эта функция работает исключительно под NT & Co.
2. Я не понял, а в какой части она сохраняет недокопированный файл и начинает дописывание файла.
Многие благодарности...
← →
Pumpkin (2002-09-30 10:27) [3]Копируй файл ручками (TFileStream: ReadBuffer, WriteBuffer например)
если destination файл не существует создай его.
если destination файл существует и его размер меньше чем у source, то открой его на fmOpenReadWrite, Seek у обеих файлов до размера destination файла и продолжай копирование до Exeptiona.
← →
Граф (2002-09-30 18:13) [4]К сожалению мне не удалось воспользоваться предложенной тобой функцией FileCopyEx по нескольким причинам. Во-первых, многие переменные Делфи (у меня 6-ой) требует объявить, среди них например, такую как CanCopy. Объявить-то их не сложно, проблема в том, что не понятно откуда их брать, возможно требуется подключить дополнительный модуль в uses, если так, то не мог бы ты указать какой именно
Во-вторых, я не очень разобрался в программе :). Например, такие параметры функции, как Style и Start. Что они означают и откуда беруться?
Идеальным выход было бы, если бы ты смог прислать рабочий пример.
← →
Rouse_ (2002-10-05 02:36) [5]Рабочий пример отослал почтой
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c