Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.007 c
4-4665
Ev_genus
2002-10-20 18:41
2002.12.02
CreateDialog


6-4541
Дмитрий К.К.
2002-10-06 19:11
2002.12.02
MSHTML_TLB.pas


3-4259
delph
2002-11-09 14:08
2002.12.02
Win2000 Terminal Server - ошибка инициализации BDE


14-4631
Anar
2002-11-11 21:31
2002.12.02
Вопрос по Outlook Express


1-4483
Вал
2002-11-20 16:48
2002.12.02
удаление строки из массива строкового типа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский