Копирование файлов по сети с докачкой

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Jornada
Посетитель
Сообщения: 38
Зарегистрирован: 10 Апрель 2008, 0:33

Копирование файлов по сети с докачкой

Сообщение Jornada »

Есть ли у кого пример использования функции CopyFileEx для решения данного вопроса? xcopy прекрасно работает, только вот на xp не хочет и я не умею смотреть прогресс с помощью этой команды)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Копирование файлов по сети с докачкой

Сообщение Yufil »

Не смотрел ABCFree шаблон apiAddSHFileOpClassCode?
Красиво копирует, с листочками летающими...
Jornada
Посетитель
Сообщения: 38
Зарегистрирован: 10 Апрель 2008, 0:33

Re: Копирование файлов по сети с докачкой

Сообщение Jornada »

Смотрел. MSDN говорит что начиная с висты функцию заменили и опять же докачку в случае обрыва связи не реализовать и сколько скопировано не узнать. А в CopyFileEx, в прототипе, нужно callback функцию винды указывать CopyProgressRoutine. И с помощью нее можно все это дело можно отслеживать. Я вот не понимаю как ее протипировать, потому и прошу пример какой нить..
Jornada
Посетитель
Сообщения: 38
Зарегистрирован: 10 Апрель 2008, 0:33

Re: Копирование файлов по сети с докачкой

Сообщение Jornada »

Подскажите плиз, чего мы подвисаем после того как копирование закончилось? Причем если в процессе сменить PROGRESS_CONTINUE на PROGRESS_QUIET (это продолжение копирования без вызова callback процедуры) пока копирование еще продолжается , то оно проходит нормально, без ошибок. И исчо вопрос такой.. второй параметр (TotalBytesTransferred) вроде как должен показывать сколько скопировано, однако у меня почему то 0. А вместо него эту цифиру показывает StreamSize.

Код: Выделить всё

Test    PROGRAM

DWORD                      EQUATE(ULONG)
WORD                       EQUATE(SIGNED)
HANDLE                     EQUATE(UNSIGNED)
LPVOID                     EQUATE(ULONG)

LPPROGRESS_ROUTINE      EQUATE(DWORD)

PROGRESS_CONTINUE EQUATE(0)
PROGRESS_CANCEL   EQUATE(1)
PROGRESS_STOP     EQUATE(2)
PROGRESS_QUIET    EQUATE(3)

COPY_FILE_RESTARTABLE           Equate(00000002h)
COPY_FILE_FAIL_IF_EXISTS        Equate(00000001h)
COPY_FILE_OPEN_SOURCE_FOR_WRITE Equate(00000004h)
COPY_FILE_NO_BUFFERING          Equate(00001000h)

loc:lpExistingFileName  CSTRING(255)
loc:lpNewFileName CSTRING(255)
  MAP
    MODULE ('Windows.dll')
         LoadLibrary(*CString NameLibrary), UnSigned,RAW,Pascal,DLL(TRUE),Name('LoadLibraryA')
         GetProcAddress(UnSigned handle, *CString NameFunction), ULong,Raw,Pascal,DLL(TRUE)
         FreeLibrary(UnSigned handle),BOOL, RAW,Pascal,DLL(TRUE)
    END
    MODULE ('')
     CopyFileEx (ulong,ulong,LPPROGRESS_ROUTINE,LPVOID,ulong,DWORD),BOOL,RAW,PASCAL,DLL(TRUE),Name('CopyFileExA'),Proc
    END
    CopyProgressRoutine (ulong, ulong, ulong, ulong, DWORD, DWORD, HANDLE, HANDLE, LPVOID),LONG,PASCAL
  END

hLib unsigned
cs    CString('kernel32.dll<0>{50}')
CopyFileEx1  ULONG,Static,Name('CopyFileExA')

  CODE
      hLib = LoadLibrary(cs);
      IF ~hLib Then MESSAGE('Íå íàéäåíà kernel32.dll')
      ELSE
         cs = 'CopyFileExA'
         CopyFileEx1 = GetProcAddress(hLib, cs)
         If ~CopyFileEx1 Then MESSAGE('Â kernel32.dll íå íàéäåíà ôóíêöèÿ CopyFileEx').
      END
      IF CopyFileEx1 THEN
      message (CopyFileEx1)

 loc:lpExistingFileName = 'c:\wood_1_1.jpg'  !Îòêóäà
 loc:lpNewFileName = 'd:\xcopy\wood_1_1.jpg' !Êóäà

 r# = CopyFileEx (address(loc:lpExistingFileName),address(loc:lpNewFileName),address(CopyProgressRoutine),0,0,COPY_FILE_RESTARTABLE)
 message ('Âñå! '&r#)
   FreeLibrary(hLib)
 end
  RETURN

!--------------------------------------------------------
CopyProgressRoutine PROCEDURE (ulong staticTotalFileSize, ulong TotalBytesTransferred, ulong StreamSize, ulong StreamBytesTransferred, DWORD dwStreamNumber, DWORD dwCallbackReason, HANDLE hSourceFile, HANDLE hDestinationFile, LPVOID lpData)
 Code
 message (staticTotalFileSize&' '&TotalBytesTransferred&' '&StreamSize&' '&StreamBytesTransferred&' '&dwStreamNumber&' '&lpData)
 return(PROGRESS_CONTINUE)

Jornada
Посетитель
Сообщения: 38
Зарегистрирован: 10 Апрель 2008, 0:33

Re: Копирование файлов по сети с докачкой

Сообщение Jornada »

Проблема была в прототипе функции CopyProgressRoutine, а точнее в типе данных LARGE_INTEGER для первых четырех параметров.
Если вместо параметра ULONG в функцию подставить по два (один LONG для младшего разряда, а другой для старшего) то тогда все отрабатывает нормально. Правда MSDN пишет, чтобы оформляли в виде группы.. что то типа такого:

LARGE_INTEGER group,type
LowPart long
HighPart long
end

Но че то у меня в таком виде не срослось.. может хоть с этим кто нить поможет?)
З.Ы. Люблю я этот форум.. сам спросил - сам ответил)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Re: Копирование файлов по сети с докачкой

Сообщение Дед Пахом »

Если с группами, то к прототипу надо добавить атрибут RAW
С уважением, ДП
Jornada
Посетитель
Сообщения: 38
Зарегистрирован: 10 Апрель 2008, 0:33

Re: Копирование файлов по сети с докачкой

Сообщение Jornada »

Вобщем оно конечно работает.. но у меня получается неприятная особенность. Пока происходит копирование невозможно переключиться на другую форму. Запуск процедуры в отдельном потоке не помогает... куды рулить?
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2329
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 18 раз

Re: Копирование файлов по сети с докачкой

Сообщение Губин Игорь »

Видимо порождаемое окно модальное (для Explorer так оно и есть). ИМХО, тут надо только смириться и получать удовольствие (ну или написать свой аналог)
Это я только кажусь дураком! На самом деле я полный идиот!
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

Re: Копирование файлов по сети с докачкой

Сообщение Shur »

Если не помогает запуск в отдельном потоке, тогда должен помочь запуск процедуры в отдельном exe.
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

Копирование файлов по сети с докачкой

Сообщение kreator »

C10, ABC. Попробовал подключить шаблон apiAddSHFileOppClass из ABCFree. Компилятор ругается вот так:
1.jpg
Приложение multi-dll. Вставляю в App, в настройках которого стоит галка "Generate ABC's as EXTERNAL". Может в этом дело? Чё-то запарился уже.
We are hard at work… for you. :)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Копирование файлов по сети с докачкой

Сообщение Yufil »

Если Multi-dll, надо класс зарегистрировать в модуле с файлами, а в других модулях сослаться на него.
Например, у меня в приложении есть модуль Files.dll с файлами и классами ABC, у него в Global Extensions добавлено расширение API:Debug Output (кстати, неплохая и полезная вещь... ), хотя именно здесь это не используется. А вот в других модулях добавлено то же самое расширение, оно генерит ссылки на класс внутри модуля Files.dll . Аналогично и с другими классами FreeABC
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

Копирование файлов по сети с докачкой

Сообщение kreator »

А как зарегистрировать? В модуле с файлами в Extensions добавил Declare_ShellClass_Global. Результат ноль. Что-то я совсем. Или может с шаблонами что-то не то? Впервые сталкиваюсь с такой проблемой.
We are hard at work… for you. :)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Копирование файлов по сети с докачкой

Сообщение Yufil »

Скорее всего, надо добавить APIAddShFileOpClass
Shfile.jpg
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

Копирование файлов по сети с докачкой

Сообщение kreator »

В Global Extensions его не добавить.
We are hard at work… for you. :)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Копирование файлов по сети с докачкой

Сообщение Yufil »

Не найду нифига у себя... После добавления Shellclass доступен объект vSHFI, методы которого можно пользовать (vSHFI.Copy(...)) . Или добавить упомянутый выше шаблон, он создаёт объект FileOp для той же цели (FileOp.Copy(...) ).

Пользовался в программе, когда надо было скопировать и удалить много файлов из каталога, чтобы юзер не скучал, а скопированный файл имел правильные дату и время. Потом сделал просто окошко с прогрессом и организовал копирование ручками (заодно научился корректно прописывать дату и время файла).
Ответить