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

  • Автор темы Автор темы Infest
  • Дата начала Дата начала

Infest

Новичок
Ребят, есть у кого нибудь скрипт, который при запуске инсталлятора убирает с файла атрибут "Только для чтения" (в моём случае с ini файла)? Пробовал использовать пару примеров, взятых с забугорных сайтов, не работают. По крайне мере на unicode точно.
 
Код:
Решение через 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;
это пробывал?
 
sergey3695, их тоже пробовал, на ansi вроде работает (тестил под ХР), на unicode нет (7, 8, 10).
 
sergey3695, да фигульки ты так снимишь если пользователь запустивший инсталл не владелец файла :hi:
 
sergey3695, огромное спасибо, поменял, заработало. Правда теперь возникла другая проблема. Т.к. требуемые, для снятия атрибута, файлы лежат в userdocs, в пути к файлу задаю соответствующую константу, однако скрипт не определяет путь, как и с константой {app}.
 
takeown ком строки сработает?
нет канешь
Скачал чел файл -> система его благополучно блокнула тк получен с другого компа, владелец естественно не он -> Права только на чтение

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


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

Вложения

  • 2015-09-26_044028.png
    2015-09-26_044028.png
    58 KB · Просмотры: 20
  • 2015-09-26_044045.png
    2015-09-26_044045.png
    52.2 KB · Просмотры: 19
Последнее редактирование:
Т.к. требуемые, для снятия атрибута, файлы лежат в 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;
 
sergey3695, большое спасибо, заработало! Правда остаётся открытым вопрос, как при запуске снять атрибут файла, лежащего в папке с программой, пробовал этим же способом добавить '{reg:HKLM\SOFTWARE\Wow6432Node\My company\My program, Installed Path}', не получается.
 
Назад
Сверху