Форум: "Начинающим";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
ВнизКопированиет с индикатором - ёлки-палки! Найти похожие ветки
← →
Zahadom (2007-05-14 13:07) [0]Не однократно пытался реализовать копирование с индикатором прогрессса ( BufSize = 3*4*4096; )... получалось...
Но только начинал пробовать работать с сетевыми дисками (доступ на которых открыт только для чтения) программа зависала и выдавала ошибку.
Как же работает тогда TotalCommander? Ему без разницы: доступ - только для чтения, или полный,... копирует и индикатор нормально работает!
Подскажите - как быть?
← →
clickmaker © (2007-05-14 13:09) [1]
> Ему без разницы: доступ - только для чтения, или полный,...
> копирует и индикатор нормально работает
если диск только для чтения, то туда никакой самы что ни на есть Тотал ничего не запишет. Ни у нас, ни за рубежом
← →
Zahadom (2007-05-14 13:20) [2]Не туда, а ОТ ТУДА!
Я про ИНДИКАТОР КОПИРОВАНИЯ говорю, что не работает (и вешает программу), если С КОТОРОГО диска копируешь на нём доступ только для чтения!!!!!!!!!!!!!!!
← →
clickmaker © (2007-05-14 13:25) [3]ну так неплохо было бы сказать, что за ошибку выдает программа?
← →
Плохиш © (2007-05-14 13:27) [4]
> Zahadom (14.05.07 13:07)
> программа зависала и выдавала ошибку.
Эти два понятия не совместимы...
PS. А файл надо открывать только на чтение, но это никакого отношения к каким-то там индикаторам не имеет. Не там проблему ищешь...
← →
Zahadom (2007-05-14 13:38) [5]Народ!
Ошибку выдаёт программа ту, которую прописываешь ты сам в коде:
"Копирование не возможно!"
"Ошибка копирования!"
...
и т.д.
PS. А файл надо открывать только на чтение, но это никакого отношения к каким-то там индикаторам не имеет. Не там проблему ищешь...
Там! Копируется через буфер прекрасно! Но меня и пользователей не устраивает это балтающееся по среди экрана окно копирования файла (то - что с кнопочкой "Отмена"). Копируется нормально функцией Copy, но к ней индикатора не пределаешь!
← →
Плохиш © (2007-05-14 13:41) [6]
> Zahadom (14.05.07 13:38) [5]
Ошибка в 17й строке
← →
clickmaker © (2007-05-14 13:44) [7]
> [5] Zahadom (14.05.07 13:38)
есть такая замечательная функция - GetLastError
А индикатор можно приделать к функции CopyFileEx
← →
Zahadom (2007-05-14 13:45) [8]На локальных дисках всё работает - как часы :-)))
Но подчёркиваю - как только начинаешь копировать с сетевого диска, открытого только для чтегия, программа, грубо говоря, встаёт!
Копируется: file.dll |_____0%_____|
И всё тут!
← →
Virgo_Style © (2007-05-14 13:47) [9]в [0] через буфер не получалось, в [5] уже получается...
Не "прописывай в коде ошибку", все получится :0) Объясни, как ты ее "прописываешь", как узнаешь, что ошибка возникла?
← →
Zahadom (2007-05-14 13:48) [10]Давайте поговорил по-другому:
у Вас есть своя программка, которая копирует файлы с индикатором на форме?
Создайте на компьютере каталог с доступом "только для чтения" и попытайтесь скопировать из него что-нибудь!
← →
iXT © (2007-05-14 13:49) [11]Еще можно API юзать. Там тебе и индикатор оконный покажут.
← →
Zahadom (2007-05-14 13:50) [12]Через буфер - я имел ввиду так:
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;
← →
Zahadom (2007-05-14 13:55) [13]Ну вот пример ошибки (Появляющееся сообщение выделено жирным цветом)
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;
← →
clickmaker © (2007-05-14 13:55) [14]
> [12] Zahadom (14.05.07 13:50)
> Через буфер - я имел ввиду так
а почему это - "через буфер"?
← →
Zahadom (2007-05-14 13:55) [15]Весь файл могу выслать!
← →
clickmaker © (2007-05-14 13:57) [16]
> [15] Zahadom (14.05.07 13:55)
> Весь файл могу выслать!
может не надо, а?
сказали же уже в [4] - файл-источник надо открывать для чтения
← →
Zahadom (2007-05-14 14:00) [17]а почему это - "через буфер"?
CreateBuffer( Src, SrcBuf );
with SHFileOpStruct do
begin...
← →
Zahadom (2007-05-14 14:03) [18]сказали же уже в [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;
← →
clickmaker © (2007-05-14 14:05) [19]
> [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:06) [20]Если закомментировать её ошибка выскакивает на:
rewrite(ToF);
Всё это происходит ТОЛЬКО при копировании с сетевого диска...
А Вы говорить "для чтения достаточно!"
← →
Zahadom (2007-05-14 14:07) [21]clickmaker © (14.05.07 14:05) [19]
Это ты с кем сейчас разговариваешь?!
← →
Плохиш © (2007-05-14 14:09) [22]
> Zahadom (14.05.07 14:07) [21]
> clickmaker © (14.05.07 14:05) [19]
>
> Это ты с кем сейчас разговариваешь?!
Вообще-то он тебе конкретно сказал, что делать надо и привёл выдержки из справки, котурую ты считаешь читать выше своего достоинства...
← →
Zahadom (2007-05-14 14:10) [23]Короче! я так понял код неисправим?
можно чем-нибудь заменить reset(FromF); и т.п.
Может что посоветуете в моём случае?
← →
clickmaker © (2007-05-14 14:11) [24]боюсь, что неисправим как раз таки не код...
← →
Плохиш © (2007-05-14 14:13) [25]
> clickmaker © (14.05.07 14:11) [24]
> боюсь, что неисправим как раз таки не код...
Да, тут без вариантов :-(
← →
Zahadom (2007-05-14 14:14) [26]Ну дайте хоть малюсенькую подсказочку!
← →
iXT © (2007-05-14 14:17) [27]Читаю и валяюся
Соrrу за oftop
← →
Плохиш © (2007-05-14 14:18) [28]
> Zahadom (14.05.07 14:14) [26]
> Ну дайте хоть малюсенькую подсказочку!
В справке не просто "малюсенькая подсказочка", а целый код для копи-паст лежит...
← →
tmp (2007-05-14 14:28) [29]FileMode := fmOpenRead; , ять! :)
Reset...
← →
Zahadom (2007-05-14 15:12) [30]Действительно, справка великая вещь!
С вышеупомянутым кодом всё получилось:
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 не помогает!
← →
Плохиш © (2007-05-14 15:20) [31]or fmShareDenyNone
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.047 c