При разработке приложений, работающих с файлами на сетевых дисках, важно учитывать производительность операций с файлами. Вопрос пользователя касается проблемы, когда перемещение файлов на сетевом диске в приложении, написанном на Delphi, происходит медленно, в отличие от быстрого перемещения через Windows Explorer. Это связано с тем, что функция перемещения файлов через Windows Shell API выполняет копирование и удаление файлов, а не их физическое перемещение, что значительно увеличивает время выполнения операции.
Описание проблемы
При использовании Windows Shell API для перемещения файлов на сетевом диске в приложении, написанном на Delphi, наблюдается нежелательное копирование и удаление файлов вместо их быстрого перемещения. Это приводит к значительному увеличению времени выполнения операции, особенно при работе с большим количеством файлов или крупных файлов.
Пример кода, вызывающего проблему
with SHFileOpStruct do
begin
Wnd := 0;
wFunc := FO_MOVE;
pFrom := PChar('\\computer\share\fileA.txt'#0
+'\\computer\share\fileB.txt'#0#0);
pTo := PChar('\\computer\share\subfolder'#0#0);
fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
end;
Result := SHFileOperationW(SHFileOpStruct);
Подтвержденное решение
Для ускорения процесса перемещения файлов рекомендуется использовать функцию MoveFileEx или MoveFileWithProgress из Windows API. Эти функции предназначены для атомарного перемещения файлов и могут быть более эффективными, особенно при работе на одном физическом диске.
Пример кода с использованием MoveFileEx
uses
Winapi.Windows;
function MoveFileEx(const SourceFileName, DestinationFileName: PChar; dwFlags: Cardinal): Boolean;
var
ResultCode: Cardinal;
begin
ResultCode := MoveFileEx(PChar(SourceFileName), PChar(DestinationFileName), MOVEFILE_REPLACE_EXISTING or MOVEFILE_WRITE_THROUGH);
Result := ResultCode <> 0;
end;
begin
if MoveFileEx('\\computer\share\fileA.txt', '\\computer\share\subfolder\fileA.txt', MOVEFILE_REPLACE_EXISTING or MOVEFILE_WRITE_THROUGH) then
// Операция перемещения файла успешно завершена
else
// Операция перемещения файла не удалась
end;
Альтернативные действия
Перед использованием MoveFileEx стоит проверить, не приводит ли отображение сетевого диска в виде локального диска через команду net use к ускорению перемещения файлов, так как это может быть простым и быстрым способом устранения проблемы.
Заключение
Использование MoveFileEx или MoveFileWithProgress вместо Windows Shell API позволит ускорить процесс перемещения файлов в приложениях на Delphi, особенно при работе с сетевыми дисками. Это решение основано на использовании более низкоуровневых функций операционной системы, что обеспечивает более высокую производительность и согласованность с действиями, выполняемыми в Windows Explorer.
Пользователь столкнулся с проблемой медленного перемещения файлов на сетевом диске в приложении, написанном на Delphi, и ищет эффективное решение, используя более подходящие функции Windows API.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.