LoadFromFile (TStringList) при автозапуске программы в Linux
Модератор: Модераторы
LoadFromFile (TStringList) при автозапуске программы в Linux
Здравствуйте.
Начал осваивать Linux, установил Lazarus, написал тестовое приложение.
Запускаю, читается текстовый файл (xxx) и содержимое выводится в TStringGrid.
Добавил программу в "Автоматически запускаемые программы", перезагружаю ПК,
получаю "Unable to open file xxx". Вопрос конечно более к работе в Linux.
Тут https://www.linux.org.ru/forum/development/13116764 советуют создать скрипт.
Неужели только так?
Начал осваивать Linux, установил Lazarus, написал тестовое приложение.
Запускаю, читается текстовый файл (xxx) и содержимое выводится в TStringGrid.
Добавил программу в "Автоматически запускаемые программы", перезагружаю ПК,
получаю "Unable to open file xxx". Вопрос конечно более к работе в Linux.
Тут https://www.linux.org.ru/forum/development/13116764 советуют создать скрипт.
Неужели только так?
AVD писал(а):Неужели только так?
Не только. Еще можно указать полный абсолютный путь к файлу. Ну, и у пользователя, под которым ваша программа "автостартует", должны быть права на чтение каталога и самого файла данных.
Код: Выделить всё
LoadMyFile('data.txt')Будет пытаться загрузить файл не из папки бинарником, а из текущей папки. При разных способах запуска текущая папка может быть разной, не обязательно той в которой лежит бинарник.
Код: Выделить всё
uses sysutils;
...
LoadMyFile(ExtractFileDir(paramstr(0))+PathDelim+'data.txt')Вот так будет загружено именно то что в папке с бинарником
paramstr(0) - путь к запущеному бинарнику
ExtractFileDir - яснопонятно из названия
PathDelim - разделитель путей принятый в целевой системе
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 системы.
Есть другой вариант вычислять программно абсолютный путь - но это не очень хорошо..
Огромное всем спасибо за столь подробные ответы.
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
1. Старайтесь не использовать относительные пути.
2. Нежелательно прописывать имена файлов и пути в коде (хотя тут контекст задачи не ясен, если это загрузка конфигурационного файла, то надо прописывать полный путь или писать код поиска файла проверяя несколько значений...)
2. Нежелательно прописывать имена файлов и пути в коде (хотя тут контекст задачи не ясен, если это загрузка конфигурационного файла, то надо прописывать полный путь или писать код поиска файла проверяя несколько значений...)
Ваш вопрос сформулирован некорректно потому, что в Линух есть несколько способов автозапуска программ.
Вы хотите запускать программу при старте системы или при старте рабочего стола: КДЕ, Гноме и т.д.?
Каждая программа запускается от определенного пользователя, поэтому должны быть установлены права доступа к папкам, файлам.
В Линух бинарные файлы размещаются в папке /usr/bin с выставленным атрибутом executable. Пользователь стандартно имеет полные права только на /home/<user name>/.
Настройки программ размещаются в папках, которые начитаются . (скрытый файл, папка) в /home/<user name>/.<имя программы> В FreePascal есть готовые функции, которые возвращают домашнюю папку пользователя, папку настроек программы.
Unit SysUtils.
Вы хотите запускать программу при старте системы или при старте рабочего стола: КДЕ, Гноме и т.д.?
Каждая программа запускается от определенного пользователя, поэтому должны быть установлены права доступа к папкам, файлам.
В Линух бинарные файлы размещаются в папке /usr/bin с выставленным атрибутом executable. Пользователь стандартно имеет полные права только на /home/<user name>/.
Настройки программ размещаются в папках, которые начитаются . (скрытый файл, папка) в /home/<user name>/.<имя программы> В FreePascal есть готовые функции, которые возвращают домашнюю папку пользователя, папку настроек программы.
Unit SysUtils.
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 только при запуске кликом мышки. Через терминал или символическую ссылку также не читает.
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
сделай ShowMessage того что передаешь в FileTxt.LoadFromFile. Убедись, что это полный путь к нужному файлу. Убедись, что все буквы находятся в нужном регистре. Т.е. в линуксе File.txt и file.txt это 2 разных файла.
MysticCoder писал(а): Убедись, что это полный путь к нужному файлу
Небеса, небеса видят как мне стыдно
На самом деле это я для примера написал FileTxt.LoadFromFile(ExtractFilePath(Application.ExeName) + TxtFile);
(для упрощения, чтобы на загружать страницу большим куском кода).
В действительности в программе гораздо больше наворочено, там парсинг кучи файлов и была ошибка - путь к файлу был не от корня.
Вот, что значит самоуверенность. Но все равно для себя считаю общение было полезным.
Всем спасибо.
