Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1174007915
DimonS
2007-03-16 04:18
2007.06.03
FastReport &amp; Excel, Word, конвертация...


15-1178122310
X9
2007-05-02 20:11
2007.06.03
ОФФТОП: Расчёт сечения кабеля


1-1175861729
Wahnsinng
2007-04-06 16:15
2007.06.03
Как отключить сообщение об ошибках


1-1175703579
Medusa__
2007-04-04 20:19
2007.06.03
Масштабирование при распечатке


2-1179379997
Alkinoos
2007-05-17 09:33
2007.06.03
MDI окна





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский