Вы можете использовать IOUtils.TFile для GetAttributes
и SetAttributes
;Вот пример из документации XE2, в котором показано использование обоих.
Поскольку файл hosts обычно довольно мал, я бы, вероятно, использовал TStringList
для его открытия и поиска, так какэто самый быстрый и простой способ.
uses
System.IOUtils;
// Clear the readonly and system attributes
var
Attributes: TFileAttributes;
SL: TStringList;
Idx: Integer;
begin
Attributes := []; // Clear any existing attributes
TFile.SetAttributes(PathAndFileName, Attributes);
SL := TStringList.Create;
try
SL.LoadFromFile(PathAndFileName);
if SL.IndexOf(YourFirstSearchString) = -1 then // Not found
SL.Add(YourFirstSearchString);
if SL.IndexOf(YourSecondSearchString) = -1 then
SL.Add(YourSecondSearchString);
SL.SaveToFile(PathAndFileName);
finally
SL.Free;
end;
Include(Attributes, TFileAttribute.faSystem);
Include(Attributes, TFileAttribute.faReadOnly);
TFile.SetAttributes(PathAndFileName, Attributes);
end;
Обратите внимание, что у вас могут возникнуть проблемы, если вы не запускаете его под учетной записью администратора, поскольку в папке Windows\
ничего не может быть записано иначе.Вы должны включить в свое приложение манифест, который сообщает Windows, что приложение требует прав администратора, поэтому UAC запросит у пользователя учетную запись администратора и пароль.Здесь приведены примеры добавления манифеста в SO.
(см. Также комментарий Дэвида к вашему вопросу о перенаправлении в 64-битной Windows.)