Форум » [x]Harbour » [?] Функция копирования файлов » Ответить

[?] Функция копирования файлов

Dima: Какая самая быстрая ? __Copyfile , Hb_fcopy и тд и тп

Ответов - 28, стр: 1 2 All

gfilatov2002: Dima пишет: Какая самая быстрая ? По-видимому, Hb_fcopy() будет побыстрее, поскольку она использует буфер размером 65536 (против 8192 у функции __Copyfile())

Dima: gfilatov2002 Спасибо !

AlexMyr: gfilatov2002 пишет: По-видимому, Hb_fcopy() будет побыстрее Вопрос спорный, и скорее верного ответа тут нет, поскольку зависит от размера файла, железа и т.п.


PSP: Что, откуда и куда тоже важно. Если по сети, то будет иметь значение, поддерживают ли сетевые интерфейсы и коммутаторы jumbo-фрейм, к примеру...

Andrey: gfilatov2002 пишет: Hb_fcopy() будет побыстрее А бегунок к ней можно приделать (для Харбора и Минигуи) ?

Pasha: Andrey пишет: А бегунок к ней можно приделать (для Харбора и Минигуи) ? Чтобы приделать, надо попросить разработчиков добавить в hb_fcopy необязательный 3-й параметр - блок кода, который вызывался бы в процессе копирования.

Dima: Вообще то быстрее стало работать с hb_fcopy Процедура была такая. В цикле локально копирую открытую базу порядка 1 гига (через RPC) Затем архивация этой копии (через RPC) Затем копирование архива по сети. На все уходило 2 минуты После переделки на все уходит 1 минута 30 секунд.

Andrey: Pasha пишет: надо попросить разработчиков добавить в hb_fcopy необязательный 3-й параметр - блок кода, который вызывался бы в процессе копирования. А как можно попросить ? Я по английски не очень... Файлы по 100-200 Мб нужно копировать на флешку. Операция медленная...

Dima: Andrey Попроси Пашу :) PS Но насколько я помню ты Harbour не юзаешь а подсел на Xharbour

Pasha: Andrey пишет: А как можно попросить ? Зарегистрироваться на https://groups.google.com/forum/#!forum/harbour-devel и отправить туда сообщение. Всего-то. Только вежливо и аргументированно :-) Я по английски не очень... Я тоже. Но есть translate.google.ru, другие online переводчики, да и другие способы. Было бы желание.

Pasha: Dima пишет: Andrey Попроси Пашу :) Уже написал PS Но насколько я помню ты Harbour не юзаешь а подсел на Xharbour Сюрприз. Оказывается, в __CopyFile из xHarbour поддерживается 3-й параметр - блок кода для прогресс-бара. Только размер буфера копирования там маленький: 8192

Dima: Pasha пишет: Сюрприз

Andrey: Pasha пишет: Сюрприз. Оказывается, в __CopyFile из xHarbour поддерживается 3-й параметр - блок кода для прогресс-бара. Только размер буфера копирования там маленький: 8192 Мне для МиниГуи надо, т.е. для Харбора ! Я отдельную утилиту (архивирование баз) делаю на МиниГуи... И уже попробовал функцию HB_FCOPY() - очень шустро работает....

Pasha: На comp.lang.xharbour тоже захотели быстрого копирования файла. И тоже обнаружили, что filecopy из ct с буфером 8к быстрее, чем copy file с буфером 512 байт. hb_fcopy с буфером 32к в xHarbour нет, а хочется еще быстрее. Enrico подсказал самое быстрое и простое решение для windows: #include "Hbdll.ch" FUNCTION MAIN() ? COPYFILE( cSource, cDest ) RETURN NIL DLL FUNCTION COPYFILE( cExistingFileName AS LPSTR, cNewFileName AS LPSTR, lFailIfExists AS LONG ) AS BOOL; PASCAL FROM "CopyFileA" LIB "kernel32.dll" В этом случае непосредственно используется функция winapi, и какой там буфер - неизвестно. Но, судя по тестам, работает она раза в 4 быстрее первых двух функций. Вот только прогресс-бар ака бегунок туда не прикрутить.. PS Мне, кстати, в harbour dev так никто и не ответил.

Dima: Pasha Не совсем понял , предложенный вариант будет быстрее чем hb_fcopy , так ?

Pasha: Dima пишет: Не совсем понял , предложенный вариант будет быстрее чем hb_fcopy , так ? Не тестировал, но должен работать быстрее. hb_fcopy открывает исходный файл - создает результирующий. Затем порциями по 32к читает/пишет данные. А через CopyFileA все делается одним вызовом функции winapi. А уж она должна быть предельно оптимизирована, это же системная функция.

Dima: Pasha Выше приведенный код в Harbour сработает ?

Pasha: Dima пишет: Выше приведенный код в Harbour сработает ? Да. Только надо собирать с библиотекой xhb, и нужны *.ch из contrib\xhb

Pasha: Для Harbour лучше вызывать эту функцию по другому: #include "hbdyn.ch" FUNCTION MAIN(cSource, cDest) hb_DynCall( { "CopyFileA", "kernel32.dll", HB_DYN_CALLCONV_STDCALL }, cSource, cDest, 0 ) RETURN NIL

Dima: Pasha А если с netio то как правильно собрать сервер netio для серверов 2003 ,2008 , 2012 ? PS Скажем для использования hb_fcopy , делаю это всего одной строкой request hb_fcopy

Pasha: Dima пишет: А если с netio то как правильно собрать сервер netio для серверов 2003 ,2008 , 2012 ? PS Скажем для использования hb_fcopy , делаю это всего одной строкой request hb_fcopy Не понял. сборка сервера netio обычная. Лучше netio собирать как сервис. Для использования hb_fcopy дать request на нее, все правильно. Можно конечно использовать CopyFileA и на сервере netio. Для этого надо дать request на hb_DynCall, а с клиента вызов будет таким: net:hb_DynCall( { "CopyFileA", "kernel32.dll", HB_DYN_CALLCONV_STDCALL }, cSource, cDest, 0 ) Но надо попробовать. Кажется, должно сработать.

Dima: Pasha пишет: Лучше netio собирать как сервис Так и делаю. Pasha пишет: Но надо попробовать. Пробну , спасибо !

Dima: Пробнул. Да быстрее работает. Через RPC Hb_fcopy время копирования 1 минута 35 сек Через RPC с новой функцией 1 минута 10 сек А на Windows Server 2012 64 бит будет работать "CopyFileA" из Kernel32 ?

Dima: Pasha пишет: а с клиента вызов будет таким: net:hb_DynCall( { "CopyFileA", "kernel32.dll", HB_DYN_CALLCONV_STDCALL }, cSource, cDest, 0 ) я сделал так netio_funcexec("hb_DynCall",{ "CopyFileA", "kernel32.dll", HB_DYN_CALLCONV_STDCALL },cSource,cDest,0)

Pasha: Dima пишет: А на Windows Server 2012 64 бит будет работать "CopyFileA" из Kernel32 ? Почему бы нет ? Эта dll есть и в system32, и в SysWOW64 (это в win7 64-bit). Ее почему-то не переименовали. Правда, это неуникодная функция, ее уникодный аналог - CopyFileW.

Dima: Ни кто не проверял , что будет если при копировании файла по сети с помощью Hb_Fcopy неожиданно ляжет сеть , что вернет Hb_Fcopy ? У себя проверить не могу так как сети нет.

Andrey: Где то это мы уже обсуждали эти команды.... Я остановился на Hb_Fcopy ! Dima пишет: Hb_Fcopy неожиданно ляжет сеть , что вернет Hb_Fcopy ? У себя проверить не могу так как сети нет. Возьми и копируй файл на флешку или дискету, а потом вытащи, получишь точно такую же ошибку !

Dima: Andrey Да я уже допер ;) А вот дискет уже не имею так как дисковода нет. Флешку решил не мучать и сделал копирование на расшаренный ресурс вида \\127.0.0.1\TEST , во время копирования снял галю на папке что она расшарена. Получил -1 , что хорошо.



полная версия страницы