Улучшение производительности функции CopyFileExW в Delphi 2010
Вопрос пользователя заключается в странной проблеме производительности при использовании функции CopyFileExW в программе на Delphi, которая была перекомпилирована из Delphi 2007 в Delphi 2010. Несмотря на то, что код остался неизменным, при копировании файлов с Windows 7 на Windows Server 2008 наблюдается существенное замедление работы программы. В контексте обсуждения уже найдено решение проблемы, которое связано с антивирусным ПО на стороне сервера. Ниже представлен пересказ материала с описанием подробностей и возможных альтернативных причин.
Оригинальный заголовок
Strange performance problem
Описание проблемы
Пользователь столкнулся с проблемой снижения производительности при использовании функции CopyFileExW для копирования файлов между системами. После перекомпиляции программы с использованием Delphi 2010, наблюдается значительное ухудшение скорости копирования с клиентских машин под управлением Windows 7 на сервер Windows Server 2008. При этом, такая же программа, скомпилированная в Delphi 2007, работает нормально.
Предполагаемые причины и решения
Антивирусное ПО: Наиболее вероятная причина заключается в том, что антивирусное ПО на стороне сервера Windows Server 2008 может считать передаваемые файлы подозрительными и проводить дополнительные проверки, что значительно замедляет процесс копирования. Отключение антивируса может решить проблему.
Неявное преобразование строк: Возможно, проблема кроется в неявном преобразовании строк, которое может возникать при вызове функции CopyFileExW. Стоит проверить параметры, передаваемые в функцию, на предмет возможных ошибок в кодировках или некорректных типов данных.
Подтвержденный ответ
Проверка показала, что проблема действительно связана с антивирусным программным обеспечением Symantec на стороне Windows Server 2008. Отключение антивируса привело к значительному улучшению производительности.
Пример кода на Object Pascal
Для демонстрации, приведем пример использования CopyFileExW на Object Pascal, который может быть использован в программах на Delphi:
uses
SysUtils,
ShlObj_pas;
function CopyFileExW(
lpExistingFileName, // указатель на строку с именем файла-источника
lpNewFileName, // указатель на строку с именем файла-назначения
LpProgressRoutine, // указатель на функцию обратного вызова для отслеживания прогресса
lpData, // указатель на данные, передаваемые обратному вызову
bCancel, // указатель на переменную, определяющую отмену копирования
dwCopyFlags // флаги копирования
): Boolean; stdcall;
var
dwFileAttributes: DWORD;
szFileName: AnsiString;
begin
// Предположим, что вы работаете с Unicode-строкой
Result := CopyFileExW(PWideChar(lpExistingFileName), PWideChar(lpNewFileName), nil, nil, bCancel, dwCopyFlags);
// Не забудьте правильно обработать строки, если используете ANSI
// или изменить тип lpExistingFileName и lpNewFileName на AnsiPChar, если ваш пример кодировки ANSI.
// Пример использования AnsiString для перевода в PAnsiChar:
// szFileName := 'SourceFile.txt';
// Result := CopyFileExW(PAnsiChar(szFileName), PWideChar('DestinationFile.txt'), nil, nil, bCancel, dwCopyCopyFlags);
end;
Заключение
При работе с функциями операционной системы, такими как CopyFileExW, важно учитывать возможное влияние сторонних приложений, таких как антивирусное ПО. Кроме того, необходимо тщательно проверять корректность передаваемых параметров, особенно строковых типов. Использование профайлеров может помочь выявить узкие места в производительности и устранить их.
Данный ответ написан с учетом основной тематики сайта, посвященного Delphi и Pascal, и содержит примеры кода на Object Pascal, что соответствует запросу.
Описание Context: Проблема производительности функции `CopyFileExW` в Delphi 2010 связана с антивирусным ПО на целевой системе, что было выявлено после перекомпиляции программы и привело к необходимости проверки параметров функции и возможного исключения
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.