Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо