Решение через FindFirst :
function SetFileAttributes(lpFileName: string; dwFileAttributes: integer): integer;
external 'SetFileAttributesA@kernel32.dll stdcall';
procedure InitializeWizard();
var
FileName: string;
SR: TFindRec;
begin
FileName:= 'C:\TEMP\aaa.txt';
FindFirst(FileName, SR);
if (SR.Attributes and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY then
SetFileAttributes(FileName, FILE_ATTRIBUTE_NORMAL);
FindClose(SR);
end;
Решение через GetFileAttributes :
function GetFileAttributes(lpFileName: string): integer;
external 'GetFileAttributesA@kernel32.dll stdcall';
function SetFileAttributes(lpFileName: string; dwFileAttributes: integer): integer;
external 'SetFileAttributesA@kernel32.dll stdcall';
procedure InitializeWizard();
var
FileName: string;
begin
FileName:= 'C:\TEMP\aaa.txt';
if (GetFileAttributes(FileName) and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY then
SetFileAttributes(FileName, FILE_ATTRIBUTE_NORMAL);
end;
function GetFileAttributes(lpFileName: string): integer;на unicode нет
нет канешьtakeown ком строки сработает?
В моём случае атрибуты снимаются с тех файлов, которые система создаёт сама при запуске программы, иными словами, никаких "чужих" файлов нет. Однако программа любит иногда ставить флажки "read only" после ковыряние настроек. Вот и интересуюсь, как через инно снять эти флажки перед установкой модифицированной версии этой программы. Товарищ sergey3695 подсказал, как подогнать код под unicode, однако теперь возникла другая проблемка, описанная выше))Скачал чел файл -> система его благополучно блокнула тк получен с другого компа, владелец естественно не он -> Права только на чтение
Картина выглядит примерно так (разрешение есть у всех групп):Infest, вот и начинается у вас самое интересное, про это речь и идёт выше, смотрите теперь кто владелец файлов настроек после изменения их программой - если пользователь(или группа администраторов) то норм, стандартными функциями снять получится, если же система - то нет, там даже админ доступ только на чтение имеет.
владелец не тут, ну раз доступ есть - к вам этот вопрос не относится.(разрешение есть у всех групп)
эта константа доступна после страницы SelectDir, думаю дальше решаемо и не интересно...{app}
Т.к. требуемые, для снятия атрибута, файлы лежат в userdocs,
[setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}
OutputDir=.
[Languages]
Name: "rus"; MessagesFile: "compiler:Languages\Russian.isl"
[Code]
function GetFileAttributes(lpFileName: string): integer;
external 'GetFileAttributesW@kernel32.dll stdcall';
function SetFileAttributes(lpFileName: string; dwFileAttributes: integer): integer;
external 'SetFileAttributesW@kernel32.dll stdcall';
procedure InitializeWizard();
var
FileName: string;
begin
FileName:= ExpandConstant('{userdocs}')+'\1.txt';
if (GetFileAttributes(FileName) and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY then
SetFileAttributes(FileName, FILE_ATTRIBUTE_NORMAL);
end;
Не помогло, однако я использовал другой рабочий способ для определения нахождения ini перед установкой.Infest, {srcexe}