LoadFromFile (TStringList) при автозапуске программы в Linux

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
AVD
незнакомец
Сообщения: 5
Зарегистрирован: 10.06.2017 20:44:18

LoadFromFile (TStringList) при автозапуске программы в Linux

Сообщение AVD »

Здравствуйте.
Начал осваивать Linux, установил Lazarus, написал тестовое приложение.
Запускаю, читается текстовый файл (xxx) и содержимое выводится в TStringGrid.
Добавил программу в "Автоматически запускаемые программы", перезагружаю ПК,
получаю "Unable to open file xxx". Вопрос конечно более к работе в Linux.
Тут https://www.linux.org.ru/forum/development/13116764 советуют создать скрипт.
Неужели только так?
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

AVD писал(а):Неужели только так?


Не только. Еще можно указать полный абсолютный путь к файлу. Ну, и у пользователя, под которым ваша программа "автостартует", должны быть права на чтение каталога и самого файла данных.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Код: Выделить всё

LoadMyFile('data.txt')

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

Код: Выделить всё

uses sysutils;
...
LoadMyFile(ExtractFileDir(paramstr(0))+PathDelim+'data.txt')

Вот так будет загружено именно то что в папке с бинарником
paramstr(0) - путь к запущеному бинарнику
ExtractFileDir - яснопонятно из названия
PathDelim - разделитель путей принятый в целевой системе
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

AVD писал(а):Добавил программу в "Автоматически запускаемые программы", перезагружаю ПК,
получаю "Unable to open file xxx".

В линухе немного другой подход к организации файловой системы. Файл/Папка может быть как реальной так и как ссылочная часть, на другое место на диске, в сети.
Пример:
/usr/bin/h2pas это ссылка на /etc/alternatives/h2pas
разумеется в /usr/bin/ h2pas своих файлов не увидит. вот в /etc/alternatives/ они могут быть..
- но на самом деле их там нет, они могут присутствовать /usr/share/freepascal/.. либо /home/user/.freepascal(оно же ~/.freepascal) для каждого юзера свои настройки.
Поэтому там нет такого подхода как у windows системы.
Есть другой вариант вычислять программно абсолютный путь - но это не очень хорошо..
AVD
незнакомец
Сообщения: 5
Зарегистрирован: 10.06.2017 20:44:18

Сообщение AVD »

Огромное всем спасибо за столь подробные ответы.
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

1. Старайтесь не использовать относительные пути.
2. Нежелательно прописывать имена файлов и пути в коде (хотя тут контекст задачи не ясен, если это загрузка конфигурационного файла, то надо прописывать полный путь или писать код поиска файла проверяя несколько значений...)
mig-31
постоялец
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Сообщение mig-31 »

Ваш вопрос сформулирован некорректно потому, что в Линух есть несколько способов автозапуска программ.
Вы хотите запускать программу при старте системы или при старте рабочего стола: КДЕ, Гноме и т.д.?

Каждая программа запускается от определенного пользователя, поэтому должны быть установлены права доступа к папкам, файлам.

В Линух бинарные файлы размещаются в папке /usr/bin с выставленным атрибутом executable. Пользователь стандартно имеет полные права только на /home/<user name>/.

Настройки программ размещаются в папках, которые начитаются . (скрытый файл, папка) в /home/<user name>/.<имя программы> В FreePascal есть готовые функции, которые возвращают домашнюю папку пользователя, папку настроек программы.
Unit SysUtils.
AVD
незнакомец
Сообщения: 5
Зарегистрирован: 10.06.2017 20:44:18

Сообщение AVD »

mig-31
mig-31 писал(а): в Линух есть несколько способов автозапуска программ

Использую Linux Mint. Меню->Параметры->Запускаемые приложения->Add. Другие способы пока не осилил.

Программу разместил тут: /home/UserName/FolderName/ProgName (файл TxtFile в папке FolderName).

Пытаюсь читать файл так: FileTxt.LoadFromFile(ExtractFilePath(Application.ExeName) + TxtFile);

Программа файл видит, т.к. "Unable to open file TxtFile".

Права доступа к файлу TxtFile 777.

Программа читает файл TxtFile только при запуске кликом мышки. Через терминал или символическую ссылку также не читает.
MysticCoder
постоялец
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Сообщение MysticCoder »

сделай ShowMessage того что передаешь в FileTxt.LoadFromFile. Убедись, что это полный путь к нужному файлу. Убедись, что все буквы находятся в нужном регистре. Т.е. в линуксе File.txt и file.txt это 2 разных файла.
AVD
незнакомец
Сообщения: 5
Зарегистрирован: 10.06.2017 20:44:18

Сообщение AVD »

MysticCoder писал(а): Убедись, что это полный путь к нужному файлу

Небеса, небеса видят как мне стыдно :oops:
На самом деле это я для примера написал FileTxt.LoadFromFile(ExtractFilePath(Application.ExeName) + TxtFile);
(для упрощения, чтобы на загружать страницу большим куском кода).
В действительности в программе гораздо больше наворочено, там парсинг кучи файлов и была ошибка - путь к файлу был не от корня.
Вот, что значит самоуверенность. Но все равно для себя считаю общение было полезным.
Всем спасибо.
mig-31
постоялец
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Сообщение mig-31 »

Включи проверку на существование файла в код.

Код: Выделить всё

if NOT(FileExists()) then Exit;
Ответить