Статья: Работа с файлами в Delphi 10.3 на Linux: разблокировка файлов с использованием TFileStream
Разработка программного обеспечения с использованием Delphi и Object Pascal часто предполагает перенос приложений между различными платформами, включая Windows и Linux. Вопросы блокировки файлов в операционных системах Windows и Linux имеют свои особенности, которые необходимо учитывать при разработке кросс-платформенных приложений.
Проблема блокировки файлов в Linux
Разработчики, работающие с Delphi, часто сталкиваются с проблемой блокировки файлов в операционных системах Linux, особенно при переносе приложений, написанных под Windows. В Windows при использовании TFileStream и режима fmShareExclusive файлы блокируются автоматически, и до освобождения потока файла они становятся недоступными для чтения, записи или удаления другими процессами. В Linux такой механизм блокировки отсутствует, и файлы остаются доступными для удаления или записи из других сессий.
Решение проблемы блокировки файлов
Для решения проблемы блокировки файлов в Linux можно использовать функцию flock, которая позволяет установить блокировку на уровне операционной системы. Например, после создания TFileStream можно применить блокировку следующим образом:
function Flock(handle, operation: Integer): Integer; cdecl; external 'libc.so.6' name '_flock';
const
LOCK_EX = 2;
...
f := TFileStream.Create(fn, fmCreate, fmShareExclusive);
Flock(f.Handle, LOCK_EX);
Однако, несмотря на применение блокировки, в Linux всё ещё возможно удалить файл из другого процесса.
Уточнение работы блокировки
Возникла необходимость в механизме блокировки, который работал бы одинаково как в разных процессах, так и в разных потоках одного процесса, как это реализовано в Windows. В Linux для проверки состояния блокировки можно использовать lsof для анализа открытых файлов и дескрипторов.
Подтверждённый ответ
В итоге был найден рабочий подход, который соответствует требованиям разработчика:
В Windows продолжать использовать простой подход с fmShareExclusive.
В Linux применять блокировку файла, как описано выше, и перед удалением файла блокировки проверять наличие эксклюзивной блокировки, используя команду lsof через popen и анализируя полученный результат.
Пример кода для проверки блокировки файла:
var
LockFileName: string;
LockCheckCommand: string;
LockCheckResult: string;
// ...
begin
LockFileName := 'path_to_lock_file';
LockCheckCommand := 'lsof -Fl ' + LockFileName;
LockCheckResult := TProcess.Run(LockCheckCommand, false).StdOut.ToString;
if Pos('lW', LockCheckResult) > 0 then
// Действия при обнаружении эксклюзивной блокировки
else
// Действия при отсутствии блокировки
// ...
end;
Этот подход позволяет реагировать на наличие блокировки и обеспечивает надёжность в случае сбоя процесса, так как блокировка файла будет снята вместе с завершением процесса.
Заключение
Разработчикам важно понимать различия в поведении файловой системы между Windows и Linux и применять соответствующие подходы для обеспечения корректной работы приложений в кросс-платформенной среде. Приведённые примеры кода и подходы могут служить основой для решения задач блокировки файлов в Linux с использованием Delphi.
Статья посвящена особенностям работы с файлами в Delphi 10.3 на Linux, в частности, рассмотрены проблемы и решения блокировки файлов при переносе приложений с Windows.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.