Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.03;
Скачать: CL | DM;

Вниз

Копированиет с индикатором - ёлки-палки!   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.065 c
8-1159187580
tst
2006-09-25 16:33
2007.06.03
TActiveMovie


15-1178816168
Ёжик
2007-05-10 20:56
2007.06.03
IP сервер-декодер Axis 292 и сетевая камера Axis


15-1178289310
Cyrax
2007-05-04 18:35
2007.06.03
Microsoft Visual C++ Runtime Library: Runtime error


15-1178637751
phpdeveloper
2007-05-08 19:22
2007.06.03
SQL запрос


15-1178351044
SerJaNT
2007-05-05 11:44
2007.06.03
Delphi for PHP