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

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

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

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

Сообщение AVD » 10.06.2017 22:22:49

Здравствуйте.
Начал осваивать Linux, установил Lazarus, написал тестовое приложение.
Запускаю, читается текстовый файл (xxx) и содержимое выводится в TStringGrid.
Добавил программу в "Автоматически запускаемые программы", перезагружаю ПК,
получаю "Unable to open file xxx". Вопрос конечно более к работе в Linux.
Тут https://www.linux.org.ru/forum/development/13116764 советуют создать скрипт.
Неужели только так?
AVD
незнакомец
 
Сообщения: 5
Зарегистрирован: 10.06.2017 21:44:18

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

Сообщение SSerge » 11.06.2017 05:40:41

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


Не только. Еще можно указать полный абсолютный путь к файлу. Ну, и у пользователя, под которым ваша программа "автостартует", должны быть права на чтение каталога и самого файла данных.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение zub » 11.06.2017 06:46:24

Код: Выделить всё
LoadMyFile('data.txt')

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

Код: Выделить всё
uses sysutils;
...
LoadMyFile(ExtractFileDir(paramstr(0))+PathDelim+'data.txt')

Вот так будет загружено именно то что в папке с бинарником
paramstr(0) - путь к запущеному бинарнику
ExtractFileDir - яснопонятно из названия
PathDelim - разделитель путей принятый в целевой системе
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение olegy123 » 11.06.2017 09:27:06

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 системы.
Есть другой вариант вычислять программно абсолютный путь - но это не очень хорошо..
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение AVD » 11.06.2017 09:41:51

Огромное всем спасибо за столь подробные ответы.
AVD
незнакомец
 
Сообщения: 5
Зарегистрирован: 10.06.2017 21:44:18

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

Сообщение shade » 11.06.2017 15:43:35

1. Старайтесь не использовать относительные пути.
2. Нежелательно прописывать имена файлов и пути в коде (хотя тут контекст задачи не ясен, если это загрузка конфигурационного файла, то надо прописывать полный путь или писать код поиска файла проверяя несколько значений...)
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

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

Сообщение mig-31 » 12.06.2017 12:04:37

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

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

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

Настройки программ размещаются в папках, которые начитаются . (скрытый файл, папка) в /home/<user name>/.<имя программы> В FreePascal есть готовые функции, которые возвращают домашнюю папку пользователя, папку настроек программы.
Unit SysUtils.
mig-31
постоялец
 
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

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

Сообщение AVD » 12.06.2017 18:08:13

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 только при запуске кликом мышки. Через терминал или символическую ссылку также не читает.
AVD
незнакомец
 
Сообщения: 5
Зарегистрирован: 10.06.2017 21:44:18

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

Сообщение MysticCoder » 12.06.2017 19:47:32

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

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

Сообщение AVD » 12.06.2017 20:33:08

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

Небеса, небеса видят как мне стыдно :oops:
На самом деле это я для примера написал FileTxt.LoadFromFile(ExtractFilePath(Application.ExeName) + TxtFile);
(для упрощения, чтобы на загружать страницу большим куском кода).
В действительности в программе гораздо больше наворочено, там парсинг кучи файлов и была ошибка - путь к файлу был не от корня.
Вот, что значит самоуверенность. Но все равно для себя считаю общение было полезным.
Всем спасибо.
AVD
незнакомец
 
Сообщения: 5
Зарегистрирован: 10.06.2017 21:44:18

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

Сообщение mig-31 » 13.06.2017 14:49:49

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

Код: Выделить всё
if NOT(FileExists()) then Exit;
mig-31
постоялец
 
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 37

Рейтинг@Mail.ru