Форум » [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
полная версия страницы