Форум » [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



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