При разработке программ на Delphi и Pascal важно учитывать особенности работы с файлами, особенно если речь идет о чтении файлов из системных папок, таких как Program Files. В Windows 7 и более новых версиях операционной системы, для защиты системных файлов от несанкционированного доступа, используется механизм виртуализации файлов. Это может приводить к непредвиденным результатам при попытке чтения файлов из защищенных папок.
Проблема
Предположим, у вас есть приложение mysoft, размещенное в папке Program Files, и вам необходимо прочитать файл afile.bin, не имея при этом административных привилегий. Использование стандартного кода на Object Pascal может привести к созданию копии файла в папке виртуализированных файлов.
procedure TForm1.Button1Click(Sender: TObject);
var
afile: File of Byte;
begin
AssignFile(Infile, 'C:\Program Files\mysoft\afile.bin');
Reset(afile);
CloseFile(afile);
end;
Решение проблемы
При вызове функции Reset файл открывается для чтения и записи, так как по умолчанию установлено значение System.FileMode = fmOpenReadWrite. Если ваше приложение работает в виртуализированном режиме и у пользователя нет административных прав, виртуализационный слой создает копию файла в папке виртуального хранилища.
Чтобы избежать этого, необходимо установить FileMode в fmOpenRead. Это откроет файл только для чтения и не вызовет виртуализационный слой.
Однако стоит помнить, что FileMode — это глобальная переменная, которая влияет на все операции ввода-вывода в стиле Pascal. Это может быть неудобно, если в приложении есть потоки или если вы забыли восстановить значение FileMode обратно в fmOpenReadWrite при необходимости записи файла.
Современные подходы
Рекомендуется использовать современные методы работы с файлами, например, TFileStream. Это позволит избежать проблем, связанных с глобальными переменными и управлением режимами доступа к файлам.
var
FS: TFileStream;
begin
FS := TFileStream.Create('C:\Program Files\mysoft\afile.bin', fmOpenRead);
try
// Чтение файла
finally
FS.Free;
end;
end;
Отключение виртуализации
Также рекомендуется отключить виртуализацию для вашего приложения, так как это было введено в Windows Vista и предназначено для помощи старым программам, которые еще не были перекомпилированы под эту операционную систему.
Для отключения виртуализации можно использовать параметр requestedExecutionLevel в манифесте приложения.
При работе с файлами в защищенных папках важно понимать особенности виртуализации файлов и использовать современные методы работы с файлами, такие как TFileStream. Это позволит избежать многих проблем и сделать ваше приложение более надежным и совместимым с современными операционными системами.
Вопрос связан с проблемами чтения файлов из системной папки `Program Files` в программах, разработанных на Delphi и Pascal, и способами решения ограничений совместимости, связанных с виртуализацией файлов в Windows.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.