![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Копированиет с индикатором - ёлки-палки!
Zahadom © (2007-05-14 13:07:00)Не однократно пытался реализовать копирование с индикатором прогрессса ( BufSize = 3*4*4096; )... получалось...
Но только начинал пробовать работать с сетевыми дисками (доступ на которых открыт только для чтения) программа зависала и выдавала ошибку.
Как же работает тогда TotalCommander? Ему без разницы: доступ - только для чтения, или полный,... копирует и индикатор нормально работает!
Подскажите - как быть?
Плохиш (2007-05-14 15:20:00) [1]or fmShareDenyNone
Zahadom (2007-05-14 15:12:00) [2]Действительно, справка великая вещь!
С вышеупомянутым кодом всё получилось:
FileMode := 0; ! :-)
А вот тут работать не хочет:
FP_Read := TFileStream.Create(Sour, fmOpenRead);
fSize := FP_Read.Size;
FP_Write := TFileStream.Create(Dest, fmCreate);
Как в справке:
fmOpenRead Open the file for reading only.
Та-же ерунда с доступом, и fmOpenRead не помогает!
tmp (2007-05-14 14:28:00) [3]FileMode := fmOpenRead; , ять! :)
Reset...
Плохиш (2007-05-14 14:18:00) [4]
> Zahadom (14.05.07 14:14) [26]
> Ну дайте хоть малюсенькую подсказочку!
В справке не просто "малюсенькая подсказочка", а целый код для копи-паст лежит...
iXT (2007-05-14 14:17:00) [5]Читаю и валяюся
Соrrу за oftop
Zahadom (2007-05-14 14:14:00) [6]Ну дайте хоть малюсенькую подсказочку!
Плохиш (2007-05-14 14:13:00) [7]
> clickmaker © (14.05.07 14:11) [24]
> боюсь, что неисправим как раз таки не код...
Да, тут без вариантов :-(
clickmaker (2007-05-14 14:11:00) [8]боюсь, что неисправим как раз таки не код...
Zahadom (2007-05-14 14:10:00) [9]Короче! я так понял код неисправим?
можно чем-нибудь заменить reset(FromF); и т.п.
Может что посоветуете в моём случае?
Плохиш (2007-05-14 14:09:00) [10]
> Zahadom (14.05.07 14:07) [21]
> clickmaker © (14.05.07 14:05) [19]
>
> Это ты с кем сейчас разговариваешь?!
Вообще-то он тебе конкретно сказал, что делать надо и привёл выдержки из справки, котурую ты считаешь читать выше своего достоинства...
Zahadom (2007-05-14 14:07:00) [11]clickmaker © (14.05.07 14:05) [19]
Это ты с кем сейчас разговариваешь?!
Zahadom (2007-05-14 14:06:00) [12]Если закомментировать её ошибка выскакивает на:
rewrite(ToF);
Всё это происходит ТОЛЬКО при копировании с сетевого диска...
А Вы говорить "для чтения достаточно!"
clickmaker (2007-05-14 14:05:00) [13]
> [18] Zahadom (14.05.07 14:03)
читаем вдумчиво примечание про ресет в хелпе
Warning: The default value of FileMode is 2 (Read/Write access). If this is not changed to a read-only file mode before calling Reset, attempts to open read-only files will fail.
а также чуть выше
Reset opens the existing external file with the name assigned to F using the mode specified by the global FileMode variable
Zahadom (2007-05-14 14:03:00) [14]сказали же уже в [4] - файл-источник надо открывать для чтения
Ну вот, добрался я до строки, которая "ругается":
procedure TForm1.CopyFileWithProgressBar1(Source, Destination: string);
var
FromF, ToF: file of byte;
Buffer: array[0..4096] of char;
NumRead: integer;
FileLength: longint;
begin
AssignFile(FromF, Source);
reset(FromF);
AssignFile(ToF, Destination);
rewrite(ToF);
FileLength := FileSize(FromF);
with Progressbar1 do
begin
Min := 0;
Max := FileLength;
while FileLength > 0 do
begin
BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead);
FileLength := FileLength - NumRead;
BlockWrite(ToF, Buffer[0], NumRead);
Position := Position + NumRead;
end;
CloseFile(FromF);
CloseFile(ToF);
end;
end;
Zahadom (2007-05-14 14:00:00) [15]а почему это - "через буфер"?
CreateBuffer( Src, SrcBuf );
with SHFileOpStruct do
begin...
clickmaker (2007-05-14 13:57:00) [16]
> [15] Zahadom (14.05.07 13:55)
> Весь файл могу выслать!
может не надо, а?
сказали же уже в [4] - файл-источник надо открывать для чтения
Zahadom (2007-05-14 13:55:00) [17]Весь файл могу выслать!
clickmaker (2007-05-14 13:55:00) [18]
> [12] Zahadom (14.05.07 13:50)
> Через буфер - я имел ввиду так
а почему это - "через буфер"?
Zahadom (2007-05-14 13:55:00) [19]Ну вот пример ошибки (Появляющееся сообщение выделено жирным цветом)
for I := 0 to DirList.Count-1 do
begin
TempList.Clear;
C:= _GetFileList(DirList.Strings[I],TempList);
if C>0 then
for K:=0 to C-1 do
begin
S := Copy(DirList.Strings[I], Length(DirSour)+1,
Length(DirList.Strings[I])-Length(DirSour)+1);
Inc(FileNum);
try
if not FileCopy(DirList.Strings[I]+'\'+TempList.Strings[K],
DirDest+S+'\'+TempList.Strings[K], VisProc, FileNum, Files) then begin
if LogFileName <> '' then CloseFile(tf);
Exit;
end;
except
if MessageBox(GetActiveWindow,'Произошла ошибка при работе с файлами'+
#13#10+'Продолжить со следующего файла?', 'Предупреждение',
MB_YESNO or MB_ICONEXCLAMATION) = IDNO then begin
if LogFileName <> '' then CloseFile(tf);
Exit;
end;
end;
end;
end;
Zahadom (2007-05-14 13:50:00) [20]Через буфер - я имел ввиду так:
with SHFileOpStruct do
begin
Wnd := AHandle; // Assign the window handle
wFunc := FO_COPY; // Specify a file copy
pFrom := FromDir;
pTo := ToDir;
fFlags := FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
if SHFileOperation(SHFileOpStruct) <> 0 then
RaiseLastWin32Error;
end;