Вопрос Убрать атрибут "Read only"

Infest

Новичок
Ребят, есть у кого нибудь скрипт, который при запуске инсталлятора убирает с файла атрибут "Только для чтения" (в моём случае с ini файла)? Пробовал использовать пару примеров, взятых с забугорных сайтов, не работают. По крайне мере на unicode точно.
 

sergey3695

Ветеран
Модератор
Код:
Решение через 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;
это пробывал?
 

Infest

Новичок
sergey3695, их тоже пробовал, на ansi вроде работает (тестил под ХР), на unicode нет (7, 8, 10).
 

Snoopak96

Старожил
sergey3695, да фигульки ты так снимишь если пользователь запустивший инсталл не владелец файла :hi:
 

Infest

Новичок
sergey3695, огромное спасибо, поменял, заработало. Правда теперь возникла другая проблема. Т.к. требуемые, для снятия атрибута, файлы лежат в userdocs, в пути к файлу задаю соответствующую константу, однако скрипт не определяет путь, как и с константой {app}.
 

Snoopak96

Старожил
takeown ком строки сработает?
нет канешь
Скачал чел файл -> система его благополучно блокнула тк получен с другого компа, владелец естественно не он -> Права только на чтение

И да на инно смену владельца трудно будет сделать, Pointer`ы любимые
 
Последнее редактирование:

Infest

Новичок
Скачал чел файл -> система его благополучно блокнула тк получен с другого компа, владелец естественно не он -> Права только на чтение
В моём случае атрибуты снимаются с тех файлов, которые система создаёт сама при запуске программы, иными словами, никаких "чужих" файлов нет. Однако программа любит иногда ставить флажки "read only" после ковыряние настроек. Вот и интересуюсь, как через инно снять эти флажки перед установкой модифицированной версии этой программы. Товарищ sergey3695 подсказал, как подогнать код под unicode, однако теперь возникла другая проблемка, описанная выше))
 

Snoopak96

Старожил
Infest, вот и начинается у вас самое интересное, про это речь и идёт выше, смотрите теперь кто владелец файлов настроек после изменения их программой - если пользователь(или группа администраторов) то норм, стандартными функциями снять получится, если же система - то нет, там даже админ доступ только на чтение имеет.
 

Infest

Новичок
Infest, вот и начинается у вас самое интересное, про это речь и идёт выше, смотрите теперь кто владелец файлов настроек после изменения их программой - если пользователь(или группа администраторов) то норм, стандартными функциями снять получится, если же система - то нет, там даже админ доступ только на чтение имеет.
Картина выглядит примерно так (разрешение есть у всех групп):


По крайне мере скриптом выше мне удалось снять галку, вот только не удалось задать путь к файлу константой {userdoc}/{app} (если прописываешь обычный путь, аля 'С:\........\*.ini', то всё нормально).
 

Snoopak96

Старожил

Вложения

Последнее редактирование:

sergey3695

Ветеран
Модератор
Т.к. требуемые, для снятия атрибута, файлы лежат в 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;
 

Infest

Новичок
sergey3695, большое спасибо, заработало! Правда остаётся открытым вопрос, как при запуске снять атрибут файла, лежащего в папке с программой, пробовал этим же способом добавить '{reg:HKLM\SOFTWARE\Wow6432Node\My company\My program, Installed Path}', не получается.
 
Сверху