Копирование файлов по сети с докачкой
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Копирование файлов по сети с докачкой
Есть ли у кого пример использования функции CopyFileEx для решения данного вопроса? xcopy прекрасно работает, только вот на xp не хочет и я не умею смотреть прогресс с помощью этой команды)
Re: Копирование файлов по сети с докачкой
Не смотрел ABCFree шаблон apiAddSHFileOpClassCode?
Красиво копирует, с листочками летающими...
Красиво копирует, с листочками летающими...
Re: Копирование файлов по сети с докачкой
Смотрел. MSDN говорит что начиная с висты функцию заменили и опять же докачку в случае обрыва связи не реализовать и сколько скопировано не узнать. А в CopyFileEx, в прототипе, нужно callback функцию винды указывать CopyProgressRoutine. И с помощью нее можно все это дело можно отслеживать. Я вот не понимаю как ее протипировать, потому и прошу пример какой нить..
Re: Копирование файлов по сети с докачкой
Подскажите плиз, чего мы подвисаем после того как копирование закончилось? Причем если в процессе сменить 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)
Re: Копирование файлов по сети с докачкой
Проблема была в прототипе функции CopyProgressRoutine, а точнее в типе данных LARGE_INTEGER для первых четырех параметров.
Если вместо параметра ULONG в функцию подставить по два (один LONG для младшего разряда, а другой для старшего) то тогда все отрабатывает нормально. Правда MSDN пишет, чтобы оформляли в виде группы.. что то типа такого:
LARGE_INTEGER group,type
LowPart long
HighPart long
end
Но че то у меня в таком виде не срослось.. может хоть с этим кто нить поможет?)
З.Ы. Люблю я этот форум.. сам спросил - сам ответил)
Если вместо параметра ULONG в функцию подставить по два (один LONG для младшего разряда, а другой для старшего) то тогда все отрабатывает нормально. Правда MSDN пишет, чтобы оформляли в виде группы.. что то типа такого:
LARGE_INTEGER group,type
LowPart long
HighPart long
end
Но че то у меня в таком виде не срослось.. может хоть с этим кто нить поможет?)
З.Ы. Люблю я этот форум.. сам спросил - сам ответил)
- Дед Пахом
- Старичок
- Сообщения: 3133
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 10 раз
- Поблагодарили: 28 раз
- Контактная информация:
Re: Копирование файлов по сети с докачкой
Если с группами, то к прототипу надо добавить атрибут RAW
С уважением, ДП
Re: Копирование файлов по сети с докачкой
Вобщем оно конечно работает.. но у меня получается неприятная особенность. Пока происходит копирование невозможно переключиться на другую форму. Запуск процедуры в отдельном потоке не помогает... куды рулить?
- Губин Игорь
- ✯ Ветеран ✯
- Сообщения: 2329
- Зарегистрирован: 16 Сентябрь 2005, 16:35
- Откуда: Москва
- Поблагодарили: 18 раз
Re: Копирование файлов по сети с докачкой
Видимо порождаемое окно модальное (для Explorer так оно и есть). ИМХО, тут надо только смириться и получать удовольствие (ну или написать свой аналог)
Это я только кажусь дураком! На самом деле я полный идиот!
Re: Копирование файлов по сети с докачкой
Если не помогает запуск в отдельном потоке, тогда должен помочь запуск процедуры в отдельном exe.
-
- ✯ Ветеран ✯
- Сообщения: 4983
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Копирование файлов по сети с докачкой
C10, ABC. Попробовал подключить шаблон apiAddSHFileOppClass из ABCFree. Компилятор ругается вот так:
Приложение multi-dll. Вставляю в App, в настройках которого стоит галка "Generate ABC's as EXTERNAL". Может в этом дело? Чё-то запарился уже.We are hard at work… for you.
Копирование файлов по сети с докачкой
Если Multi-dll, надо класс зарегистрировать в модуле с файлами, а в других модулях сослаться на него.
Например, у меня в приложении есть модуль Files.dll с файлами и классами ABC, у него в Global Extensions добавлено расширение API:Debug Output (кстати, неплохая и полезная вещь... ), хотя именно здесь это не используется. А вот в других модулях добавлено то же самое расширение, оно генерит ссылки на класс внутри модуля Files.dll . Аналогично и с другими классами FreeABC
Например, у меня в приложении есть модуль Files.dll с файлами и классами ABC, у него в Global Extensions добавлено расширение API:Debug Output (кстати, неплохая и полезная вещь... ), хотя именно здесь это не используется. А вот в других модулях добавлено то же самое расширение, оно генерит ссылки на класс внутри модуля Files.dll . Аналогично и с другими классами FreeABC
-
- ✯ Ветеран ✯
- Сообщения: 4983
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Копирование файлов по сети с докачкой
А как зарегистрировать? В модуле с файлами в Extensions добавил Declare_ShellClass_Global. Результат ноль. Что-то я совсем. Или может с шаблонами что-то не то? Впервые сталкиваюсь с такой проблемой.
We are hard at work… for you.
-
- ✯ Ветеран ✯
- Сообщения: 4983
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Копирование файлов по сети с докачкой
В Global Extensions его не добавить.
We are hard at work… for you.
Копирование файлов по сети с докачкой
Не найду нифига у себя... После добавления Shellclass доступен объект vSHFI, методы которого можно пользовать (vSHFI.Copy(...)) . Или добавить упомянутый выше шаблон, он создаёт объект FileOp для той же цели (FileOp.Copy(...) ).
Пользовался в программе, когда надо было скопировать и удалить много файлов из каталога, чтобы юзер не скучал, а скопированный файл имел правильные дату и время. Потом сделал просто окошко с прогрессом и организовал копирование ручками (заодно научился корректно прописывать дату и время файла).
Пользовался в программе, когда надо было скопировать и удалить много файлов из каталога, чтобы юзер не скучал, а скопированный файл имел правильные дату и время. Потом сделал просто окошко с прогрессом и организовал копирование ручками (заодно научился корректно прописывать дату и время файла).