Перейти к содержанию
Fire Monkey от А до Я
  • 0

Вопрос

Доброго времени суток, форумчане!

Есть программка, которая имеет свой конфиг. И если на винде, я могу спокойно складировать этот конфиг в папку C:\ProgramData, то с маком всё сложнее. Просто так записать конфиг и папку в /Library/Application Support/ не получится, требуются права администратора. Замучавшись с попытками сохранения конфига в эту папку, я решила пойти другим путём и заставила программу сохранять этот конфиг (вместе с последующими генерируемыми программой файлами) внутрь себя (MyProgramm.app/Contents/MacOS). Первое время всё работало нормально, файлы сохранялись, генерировались в саму программу. Но, как обычно бывает, что-то пошло не так и... В результате, сейчас я имею то, что программа при первом запуске из RAD генерирует первый конфиг в себя (MyProgramm.app/Contents/MacOS/Config.cfg), запускается при запуске из RAD. НО, стоит мне запустить её независимо от студии (в надеждах, что она считает конфиг внутри себя, как она делала раньше), как она просто падает. Добавив небольшое ShowMessage(FileExists('Config.cfg').ToString()); в качестве отладки, я узнаю, что она падает из-за того, что НЕ МОЖЕТ НАЙТИ ФАЙЛ КОНФИГА, ЧТО НАХОДИТСЯ В НЕЙ САМОЙ. Затем, методом тыка было обнаружено, где именно он пытается найти этот файл - в корне диска с системой. Вопрос к вам, как пофиксить это дерьмо? 

Сразу скажу, код со вчерашнего дня вообще не менялся. Фрагмент работы с конфигом я приложила ниже.

procedure TForm1.FormCreate(Sender: TObject);
var
	PRGP, OUTP: String;
    i: Integer;
begin
{тут находится код для MSWINDOWS}
{$IFDEF POSIX}
AssignFile (CFG, 'AErenderConfiguration.cfg');			//Привязка файла, что по идее должен быть внутри софта
if FileExists ('AErenderConfiguration.cfg') then		//Тут ошибка вылезает, потому что он не может найти файл в корне диска
	begin												//Чтение самого конфига
    	Reset (CFG);
        Readln (CFG, LANG);
        Readln (CFG, PRGP);
        Readln (CFG, OUTP);
        Readln (CFG, AERPATH);
        Readln (CFG, DEFPRGPATH);
        Readln (CFG, DEFOUTPATH);
        projectPath.Text := PRGP;
        outputPath.Text := OUTP;
        Lang1.Lang := LANG;
        CloseFile (CFG);
    end
else
	begin		//Действия, если конфиг не существует. Тоже ошибка, потому что в macOS корень диска заблокирован для записи.
    	Rewrite (CFG);
        for i := 1 to 6 do
        	Writeln (CFG, ' ');
        LANG := 'EN';
        Lang1.Lang := LANG;
        CloseFile (CFG);
    end;
{$ENDIF POSIX}

RAD Studio 10.3 Rio (26.0.32429.4364), PAServer 20.0, macOS 10.13.6 High Sierra (MacBook 13" Mid 2010). 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
19 часов назад, Равиль Зарипов (ZuBy) сказал:

попробуйте указать


./AErenderConfiguration.cfg

Попробовала - та же проблема. Первый запуск нормально, последующие - пытается найти файлы в корне диска.

Ссылка на комментарий
  • 1

Добрый день. А вы не пробовали указывать не только имя файла, но и путь к нему? Я недавно с FM познакомился, не самый большой специалист по Маку ), но я бы не полагался на указание файла без каталога. У меня сделано так, например:

function GetAppPath(): string;
begin
    Result := TPath.GetDirectoryName(ParamStr(0));
end;
 

function MakeSettingsFileName(aInsideApp: boolean): string;
var
    lFileName: string;
begin
    lFileName := TPath.GetFileNameWithoutExtension(ParamStr(0)) + '.ini';
    if (aInsideApp) then
        Result := GetAppPath()
    else
        Result := TPath.GetDocumentsPath();
    Result := TPath.Combine(Result, lFileName);
end;

Смысл такой: поскольку приложение в macOS распространяется через dmg-пакет, я включаю конфигурационный файл внутрь Program.app, как раз в папку Contents/MacOS/, чтобы программе было с чем запуститься в первый раз (всяческие настройки соединения с сервером, БД, ну вы понимаете). В самой программе, я сначала делаю проверку наличия конфигурационного файла, сформировав путь до него вызовом функции MakeSettingsFileName(false). В этом случае, конф. файл ищется в каталоге Документы. Это, на самом деле, не так и важно, где он может лежать снаружи, идея тут в том, что в процессе работы конф. файл меняется и при выходе из программы всегда сохраняется снаружи, чтобы иметь возможность пользоваться им после замены dmg-пакета и инсталляции новой версии программы, которая опять будет содержать внутри себя "пустой" конф. файл. Если файл снаружи не нашелся, формируем повторным вызовом MakeSettingsFileName(true) путь к нему "внутри". Надеюсь, что понятно объяснил.

Изменено пользователем Andrey Yakovlev
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...