Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Работа с файлами  (Прочитано 6445 раз)

h71

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Работа с файлами
« : 09 Сентября 2018, 15:39:33 »
Здравствуйте,
Есть проблема, которую никак не могу победить:
Код: (delphi)
if (TextFileOpen('report.txt', 'c:\', fomRewrite, fcpUTF8) = False) then
  ShowMessageClient(GetClientName, 'Внимание!', 'Ошибка открытия файла', clGray, clBlack)
else
  // Тут пишем в файл и т.д.
Если указываю полный путь (например, как в коде выше 'c:\') получаю ошибку открытия файла. Если путь пустой (''), файл открывается и записывается в папке проекта на сервере, но тогда каким образом открыть его на клиенте внешней программой типа notepad?         
« Изменён: 10 Сентября 2018, 09:23:38 от Simple-Scada »

h71

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Работа с файлами
« Ответ #1 : 09 Сентября 2018, 17:16:43 »
Разбираясь в работе с файлами и директориями, обнаружил вот что:
1) Для записи файла нужно иметь соответствующие права для той папки куда пишем. Вроде очевидно, но в справке надо бы отразить. Скажем, у меня скрипт  в D:\ записывал без проблем, а в C:\ уже нет, пока права доступа для пользователей явно не поменял.
2) Самое главное, не нашел способ создавать файл на том клиенте, который вызвал скрипт. GetProgramPathClient выдает путь к папке на клиенте, но файл с таким путем создается на сервере.

Собственно, задача простая как hello world: по клику на кнопке в клиенте создать текстовый файл и открыть его при помощи notepad тут же в клиенте. Полдня убил, но не смог этого сделать. Ткните носом, куда смотреть  :(
« Изменён: 09 Сентября 2018, 17:17:56 от h71 »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Работа с файлами
« Ответ #2 : 10 Сентября 2018, 09:23:14 »
Здравствуйте.

Цитировать
Если путь пустой (''), файл открывается и записывается в папке проекта на сервере, но тогда каким образом открыть его на клиенте внешней программой типа notepad?
Все процедуры для работы с файлами работают только на серверном ПК. Для запуска программ (например блокнота) на клиентах нужно использовать процедуру RunApplication, например можно разместить на мнемосхеме кнопку и на событие OnClick этой кнопки написать следующий код:
Код: (delphi)
begin
  { запускаем блокнот и открываем файл "File.txt" на клиенте который нажал кнопку }
  RunApplication(GetClientName, 'notepad.exe', 'D:\File.txt');
end.

Цитировать
2) Самое главное, не нашел способ создавать файл на том клиенте, который вызвал скрипт. GetProgramPathClient выдает путь к папке на клиенте, но файл с таким путем создается на сервере.
Создавать файлы на клиентах через процедуры для работы с файлами нельзя. Они работают только на сервере.

h71

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Работа с файлами
« Ответ #3 : 11 Сентября 2018, 14:02:09 »
Спасибо за ответ, хотя непонятно, зачем ограничивать клиента в возможностях по созданию локальных файлов. Кмк, это элементарнейший функционал который должен быть.
Сейчас же пришлось применить солдатскую смекалку, и запускать на сервере простенький http сервер и туда записывать файл, а на клиенте запускать браузер для просмотра :)

Тогда еще один вопрос тут, что бы не плодить новые темы: как по клику на кнопке запустить приложение на клиенте с задержкой в несколько сек?
Вопрос связан с тем, что нажатие кнопки формирует запрос к архивным переменным при помощи функций работы с архивом, а функции эти по опыту использования выдают результат не моментально. Данные полученные как результат выполнения архивных функций мне нужно открыть на клиенте внешней программой.
И вот возникает проблема: по нажатию кнопки я могу вызвать свою процедуру обработки архивных данных + открыть внешнюю прогу, но результата я не увижу: данных еще нет, переменные в нулях или содержат данные с прошлого раза. Пришлось создавать две кнопки - одна вызывает функции работы с архивом, вторая запускает внешнюю прогу. Т.е. пользователь должен нажать первую кнопку, подождать и нажать вторую. За такой костыль мне перед заказчиком неудобно. Помогите кто чем может )

P.S: Удалось сделать таким образом: раз функция GetClientName не работает из под секундных скриптов или скриптов по изменению значения переменных, то по нажатию кнопки имя клиента пишем в переменную, запускаем таймер и по таймеру запускаем на клиенте приложение через RunApplication, имя клиента берем из переменной, где мы его перед этим сохранили
« Изменён: 11 Сентября 2018, 17:38:59 от h71 »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Работа с файлами
« Ответ #4 : 12 Сентября 2018, 11:03:37 »
Цитировать
Спасибо за ответ, хотя непонятно, зачем ограничивать клиента в возможностях по созданию локальных файлов.
Мы ничего не ограничивали. В Simple-Scada никогда не было функций для работы с файлами на клиентах, т.к. клиенты не имеют отношения к выполнению скриптов, все скрипты выполняются на сервере.

Цитировать
P.S: Удалось сделать таким образом: раз функция GetClientName не работает из под секундных скриптов или скриптов по изменению значения переменных, то по нажатию кнопки имя клиента пишем в переменную, запускаем таймер и по таймеру запускаем на клиенте приложение через RunApplication, имя клиента берем из переменной, где мы его перед этим сохранили
Сейчас можно использовать только описанный Вами способ. В будущих версиях постараемся упростить массовое выполнение архивных функций. Возможно добавим отдельный тип события для скриптов, с привязкой к имени клиента, который будет срабатывать когда указанные пользователем архивные функции полностью выполнились. Тогда не придется делать свою систему для определения момента, когда все архивные функции выполнились.

MaxHari

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Работа с файлами
« Ответ #5 : 18 Декабря 2019, 20:22:10 »
Здравствуйте!

Подскажите, пожалуйста, решение по работе с файлами на системном диске.
Необходимо считывать информацию из файла 'C:\Program Files\...'.
Скада его не видит, хотя в других случаях всё работает нормально.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Работа с файлами
« Ответ #6 : 19 Декабря 2019, 10:03:51 »
Здравствуйте. Что значит "не видит"? При попытке доступа к файлу в журнале сервера выводится сообщение о том, что файл не найден? Или просто скада не может его прочитать? На это могут быть только две причины. Первая: в скаде был указан неправильный путь к файлу (убедитесь что путь и имя файла указаны правильно). Вторая: у файла ограничены права на чтение, поэтому его не сможет прочитать никакое приложение, включая скаду (тогда измените права на доступ к файлу в Windows).

MaxHari

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Работа с файлами
« Ответ #7 : 19 Декабря 2019, 14:59:43 »
Скада выходит на этапе проверки на существование файла - File not exitst. Журнал перегружен сообщениями об ошибках другого плана, на эту тему ничего не нашёл.

Путь к файлу формирую следующим образом (положив его предварительно в корень 'D:\'):
Код
aPath := 'D:\' + objectId + '_mconst.ini';

Если убрать начало 'D:\', то Скада будет искать его в файлах проекта, что успешно проходит. А в данном случае просто не видит, права на файл сделал для всех Full access.
Система - Windows 10 Home.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Работа с файлами
« Ответ #8 : 19 Декабря 2019, 15:26:47 »
Вы открываете файл через TextFileOpen? Если да, то у неё есть два отдельных параметра, первый - имя файла, второй - путь к файлу, см. руководство. Возможно Вы передаёте всё одним параметром? Если да, то это неправильно. Пример:
Код: (delphi)
TextFileOpen(objectId + '_mconst.ini', 'D:\', fomReset, fcpUTF8);

Цитировать
Если убрать начало 'D:\', то Скада будет искать его в файлах проекта
Это не потому что Вы убрали 'D:\', а потому что не указали параметр-путь к файлу и оставили его пустым. Прочтите описание параметра APath в руководстве.

Цитировать
Журнал перегружен сообщениями об ошибках другого плана, на эту тему ничего не нашёл.
Ошибки лучше исправить, чтобы не возникало других проблем.
« Изменён: 19 Декабря 2019, 15:29:46 от Simple-Scada »

MaxHari

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Работа с файлами
« Ответ #9 : 23 Декабря 2019, 00:34:56 »
Цитировать
Вы открываете файл через TextFileOpen? Если да, то у неё есть два отдельных параметра, первый - имя файла, второй - путь к файлу, см. руководство. Возможно Вы передаёте всё одним параметром? Если да, то это неправильно. Пример:
Код: (delphi)
TextFileOpen(objectId + '_mconst.ini', 'D:\', fomReset, fcpUTF8);

Да, так и есть. Исправил, всё заработало :-)
С ошибками будем что-то делать по мере освобождения от сверх срочных задач. Система стабильно работает, но в логи они почему-то сыпятся, нужно вникать.
Cпасибо за помощь.