Сообщество программистов Autodesk в СНГ

ADN Club => AutoLisp / VisualLISP и DCL => Тема начата: BearDyugin от 22-01-2016, 19:35:13

Название: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: BearDyugin от 22-01-2016, 19:35:13
В общем, почти все мои приложения записывают маленькие вспомогательные файлики на компьютер пользователя, какие для записи настроек приложения, какие с записью регистрационных данных.
Место для записи искал так
Код - Auto/Visual Lisp [Выбрать]
  1. (findfile "acad.pat")
и всегда оно возвращало, что-то типа  "c:\Users\имя_пользователя\ Application Data\имя_продукта\версия\язык\acad.pat".
Но вот у одного пользователя запись файла выдавала ошибку, и выяснилось, что у него acad.pat нашёлся не в AppData, а в Program files а туда походу нельзя писать  :D
Стал искать, нашёл у Lee Mac
Код - Auto/Visual Lisp [Выбрать]
  1. (defun numinc:getsavepath ( / tmp )
  2.     (cond      
  3.         (   (setq tmp (getvar 'roamablerootprefix))
  4.             (strcat (numinc:fixdir tmp) "\\Support")
  5.         )
  6.         (   (setq tmp (findfile "acad.pat"))
  7.             (numinc:fixdir (vl-filename-directory tmp))
  8.         )
  9.         (   (numinc:fixdir (vl-filename-directory (vl-filename-mktemp))))
  10.     )
  11. )

Интересная системная переменная ROAMABLEROOTPREFIX (http://exchange.autodesk.com/autocad/rus/online-help/browse#WS1a9193826455f5ffa23ce210c4a30acaf-4eb1.htm)

Но Lee почему-то перестраховывается и рассматривает вариант, что она может быть nil, и второй вариант у него как раз поиск acad.pat, который у меня привёл к ошибки.

Ну и как быть? Можно ли положиться только на ROAMABLEROOTPREFIX или искать например не acad.pat, который лежит и там и там, а скажем, acad.cuix ?
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: Александр Ривилис от 22-01-2016, 20:19:13
или искать например не acad.pat, который лежит и там и там, а например acad.cuix ?
acad.cuix/acad.cui (в зависимости от версии AutoCAD) тоже не идеальный, но неплохой вариант. Тот который найдётся действительно будет лежать в доступном для записи каталоге (иначе нельзя редактировать конфигурацию). Найти его  можно при помощи (getvar "menuname")
Еще варианты (из системы): (getenv "USERPROFILE") -> "C:\\Users\\Rivilis-AN"
Или (getenv "LOCALAPPDATA") -> "C:\\Users\\Rivilis-AN\\AppData\\Local"
Или (getenv "APPDATA") -> "C:\\Users\\Rivilis-AN\\AppData\\Roaming"
Еще привязанный к AutoCAD:
(getenv "ProfileStorage") -> "C:\\Users\\Rivilis-AN\\appdata\\roaming\\autodesk\\autocad 2016\\r20.1\\enu\\support\\profiles\\fixedprofile.aws"

Для начала хватит? :)
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: BearDyugin от 23-01-2016, 06:28:04
Для начала хватит?
Хватит, спасибо.
Но меня мучает вопрос, зачем Lee подстраховывался? в каком случаи любая из этих системных переменных может быть nil, лишь в том случаи, если это относительно новая переменная и в ранних версиях AutoCAD её не было?
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: BearDyugin от 23-01-2016, 08:09:59
"C:\\Users\\Rivilis-AN"
"C:\\Users\\Rivilis-AN\\AppData\\Local"
"C:\\Users\\Rivilis-AN\\AppData\\Roaming"
Опять же проверил, все эти папки не содержат файлов, только папки, как то паливо туда файлы писать   :-\
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: Андрей Бушман от 23-01-2016, 13:22:30
В общем, почти все мои приложения записывают маленькие вспомогательные файлики на компьютер пользователя, какие для записи настроек приложения, какие с записью регистрационных данных.
Место для записи искал так
Код - Auto/Visual Lisp [Выбрать]
  1. (findfile "acad.pat")
Почему не хочешь для хранения своих вспомогательных файлов прописывать полный путь, вместо того, чтобы завязываться на расположение акадовских файлов? Например так: %AppData%\Geobuilder\<AppName>\tmp\.

Цитата: Geobuilder
все эти папки не содержат файлов, только папки, как то паливо туда файлы писать   :-\
А непосредственно в них файлы писать и не нужно. Создавай нужную тебе структуру подкаталогов и используй её по своему усмотрению. Принято в %AppData% (как и в %ProgramData%, %ProgramFiles%) подкаталоги формировать по правилу: %AppData%\<CompanyName>\<ApplicationName>\.
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: BearDyugin от 23-01-2016, 14:35:06
Почему не хочешь для хранения своих вспомогательных файлов прописывать полный путь
Никогда не думал об этом, у кого-то давно в коде встретил, как вообще файлы создавать так и делал.
Всё же файл с сохранением пользовательских настроек думаю стоит привязывать к конкретному AutoCAD-у.
А файл с регистрацией приложения, хотелось тоже писать более не заметно, чем создавать каталог <CompanyName>.
В целом спасибо за совет.
И как я уже проверил Autolisp не понимает
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-mkdir "%AppData%\\CompanyName")
только так   
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-mkdir (strcat (getenv "APPDATA") "\\CompanyName"))
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: Александр Ривилис от 23-01-2016, 14:49:45
в каком случаи любая из этих системных переменных может быть nil, лишь в том случаи, если это относительно новая переменная и в ранних версиях AutoCAD её не было?
Именно так. В ранних версиях этой переменной не было
Цитата: Александр Ривилис от 22-01-2016, 19:19:13

    "C:\\Users\\Rivilis-AN"
    "C:\\Users\\Rivilis-AN\\AppData\\Local"
    "C:\\Users\\Rivilis-AN\\AppData\\Roaming"

Опять же проверил, все эти папки не содержат файлов, только папки, как то паливо туда файлы писать   :-\
У меня там есть и файлы.
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: Андрей Бушман от 23-01-2016, 14:55:12
Всё же файл с сохранением пользовательских настроек думаю стоит привязывать к конкретному AutoCAD-у.
Ну так ты можешь, при желании разносить настройки по разным файлам в твоём каталоге, либо группировать их в рамках одного и того-же конфиг-файла.

Цитата: Geobuilder
А файл с регистрацией приложения, хотелось тоже писать более не заметно, чем создавать каталог <CompanyName>.
Однако предложенная мною структура позволяет чётко определить, какой набор файлов не является "родным" для акада. На мой взгляд, хранить настройки плагинов и файлы, необходимые для их работы, целесообразней в своей структуре каталогов, не перемешивая их с "родными" файлами акада. Это облегчает и удаление их, если что-то пойдёт не так, да и позволяет более удобно это всё осматривать (не мозолят глаза лишние файлы акада - мухи отдельно от котлет).

Если в акадовский каталог будут писать файлы разные расширения от разных разработчиков, вместо того, чтобы распределять их по подкаталогам согласованной структуры, то этот каталог очень быстро превратится в помойку, в которой трудно будет разобраться. А это самое "разобраться" может понадобиться в том случае, если вдруг возникнут проблемы (например, после загрузки очередного плагина, акад стал работать как инвалид), т.к. не понятно, какие файлы в каталоге акадовские, а какие "левые" (чтобы удалить ненужный контент, закинутый кривым плагином).
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: Александр Ривилис от 23-01-2016, 15:12:46
Если в акадовский каталог будут писать файлы разные расширения от разных разработчиков, вместо того, чтобы распределять их по подкаталогам согласованной структуры, то этот каталог очень быстро превратится в помойку, в которой трудно будет разобраться.
Согласен абсолютно.
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: BearDyugin от 23-01-2016, 15:24:06
не понятно, какие файлы в каталоге акадовские, а какие "левые" (чтобы удалить ненужный контент, закинутый кривым плагином).
Всё, понял, не буду.
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: Андрей Бушман от 23-01-2016, 15:35:12
как я уже проверил Autolisp не понимает
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-mkdir "%AppData%\\CompanyName")

только так   
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-mkdir (strcat (getenv "APPDATA") "\\CompanyName"))
Ну так я же не lisp-код показывал, но само расположение каталога. :) Можно написать функцию, которая будет разворачивать имя переменной, присутствующей в составе пути, в её значение (дабы не использовать обозначенное тобою решение, которое нельзя "упрекнуть" в гибкости).

Если для какого-то набора файлов тебе нужен не переносимый локальный профиль (см. по обстоятельствам), то вместо %AppData% можно использовать %LocalAppData%.
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: BearDyugin от 23-01-2016, 18:26:17
Off-Topic: показать
Я честно очень вам всем благодарен, и даже понимаю вас, это тут я нуб, среди программистов. А на геодезическом форуме я очень даже специалист, и иногда вопросы новичков ставят в тупик, вопрос очень простой, но ты даже не знаешь с чего начать объяснять...

будет разворачивать имя переменной, присутствующей в составе пути, в её значение
не переносимый локальный профиль
Я пять раз прочитал, но всё равно не понял  :o т.е. как бы вроде всё по-русски и о простом, и не самое важное, принципиальный ответ уже был выше...
Мне очень нравятся ответы Горлова Николая, они и улыбку вызывают стилем написания и понятно всё как на пальцах  :D
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: Александр Ривилис от 23-01-2016, 18:31:32
Я пять раз прочитал, но всё равно не понял
Есть официальный термин в Microsoft Windows: "Перемещаемый профиль" (https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D0%B8_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9)
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: Андрей Бушман от 23-01-2016, 18:37:02
Я пять раз прочитал, но всё равно не понял  :o т.е. как бы вроде всё по-русски и о простом, и не самое важное, принципиальный ответ уже был выше...
Мне очень нравятся ответы Горлова Николая, они и улыбку вызывают стилем написания и понятно всё как на пальцах  :D
На пальцах, говоришь... Попробую.

Пользовательский профиль Windows состоит из двух частей: переносимой и непереносимой.

Копия переносимого профиля сохраняется в сети (если компьютер доменный) каждый раз, как ты завершаешь свой сеанс работы в Windows (т.е. серверна копия профиля синхронизируется с локальной).

Каждый раз, как ты входишь в систему (т.е. вводишь логин и пароль), происходит обратная синхронизация: твоя локальная версия переносимого пользовательского профиля перезаписывается серверной.

Для чего это надо? Если твой компьютер находится в домене Windows (как это обычно и бывает на работе), то ты можешь сесть работать за любой, произволный доменный компьютер твоей организации, ввести свой логин и пароль, после чего на этот компьютер автоматом из сети скачается твой переносимый пользовательский профиль Windows (т.е. файлы и папки, хранящиеся в %AppData%), а по завершению сеанса работы, внесённые тобой в переносимый профиль изменения будут сохранены и в сети. Т.е. ты можешь продолжать пересаживаться за др.компьютеры, каждый раз получая там обновлённую копию своего переносимого профиля. Так понятней?

В виду обозначенной синхронизации не рекомендуется в переносимый профиль (например на рабочий стол) кидать большой объём информации, т.к. в этом случае время, затрачиваемое на синхронизацию существенно увеличивается.

Для более развёрнутой документации по теме перемещаемого профиля - читай доки в MSDN.

как бы вроде всё по-русски и о простом, и не самое важное, принципиальный ответ уже был выше...
Ну как сказать... Понимать то, куда какую информацию лучше записывать, учитывая специфику переносимого и непереносимого профиля - это не так уж и "не самое важное". ИМХО.
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: Дмитрий Загорулькин от 27-01-2016, 22:21:06
Я когда на LISP приложения писал, регистрационные данные в реестре хранил. Там же у меня были какие-то настройки, если для их хранения достаточно было одной переменной - строка, число и т.п. Хранил в HKCU/Software/<Мой раздел>/<Подразделы>. Это в качестве альтернативы.
А что касается файлов с данными:
Либо просил пользователя задать путь к ним с помощью диалога. То есть, пользователь мог сделать несколько файлов с данными, хранить их в любом удобном для него месте и подгружать тот, который ему нужен в данный момент. Абсолютный путь к текущему файлу с данными сохранял в реестре в переменной.
Либо в папке рядом с LSP-файлом делал подпапки для файлов данных. Папка, в которой лежал LISP, при установке прописывалась в путь поддержки, а потом, опираясь на этот путь, искались данные для программы. Если грубо и без проверок, то как-то так: (strcat (findfile "myApp.lsp") "\\Data\\Settings.ini")
Сейчас,в .NET я храню данные в %APPDATA%/<Моя папка>, как и советуют уважаемые коллеги :).
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: Андрей Бушман от 27-01-2016, 22:25:57
Папка, в которой лежал LISP, при установке прописывалась в путь поддержки
Если под каждый LISP добавлять каталог поиска, то Support File Search Path достаточно быстро превратится в помойку. Тынц (http://bushman-andrey.blogspot.ru/2012/03/autocad.html).
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: Дмитрий Загорулькин от 27-01-2016, 23:30:21
Да, я помню эту твою довольно толковую задумку. Но тут проблема в том, что этот механизм придется самим разрабатывать и поддерживать. Если бы это каким-то образом было бы внедрено в AutoCAD самим Autodesk'ом, то могло бы стать хорошим стандартом для всех разработчиков. А пока реальность такова, что да, каждое более-менее серьезное приложение добавляет как минимум один путь в SupportPaths. Я говорю не об отдельном LISP файле, а именно о законченном приложении, которое может состоять как из одного, так и из нескольких LSP/DCL/DLL и вспомогательных файлов. Если использовать тот механизм, который предлагает Autodesk - Bundle-пакет, то я пока не могу представить, как можно сделать по другому.
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: Андрей Бушман от 28-01-2016, 00:11:37
Но тут проблема в том, что этот механизм придется самим разрабатывать и поддерживать. Если бы это каким-то образом было бы внедрено в AutoCAD самим Autodesk'ом, то могло бы стать хорошим стандартом для всех разработчиков.
Какой ещё "механизм"? Чего "поддерживать"? Если говорить о AutoCAD новее чем 2011, то каталоги для размещения bundle-пакетов определены - размещаешь там свои приложения в соответствии с правилами, обозначенными Автодеском в документации (банальный копипаст). Чем не устроил "новый" механизм загрузки от Автодеска? Если говорить о более ранних версиях AutoCAD, то и тут проблем нет - юзер или админ принимает решение о том, в каком каталоге будет хранить все плагины акада и добавляет этот каталог в пути поиска. Затем просто копирует каталоги пользовательских плагинов в этот каталог. Всё. Какой тут "механизм" нужен? Чего там требуется "поддерживать"?
А пока реальность такова, что да, каждое более-менее серьезное приложение добавляет как минимум один путь в SupportPaths. Я говорю не об отдельном LISP файле, а именно о законченном приложении, которое может состоять как из одного, так и из нескольких LSP/DCL/DLL и вспомогательных файлов.
"Серьёзные" приложения относятся к вопросу своего размещения и конфигурирования серьёзно и предоставляют тому, кто устанавливает приложение, указать каталог его размещения. Если указан один из каталогов, присутствующих в каталогах поддержки, то "серьёзному" приложению нет нужды писать дополнительную запись в каталоги поиска, при условии, что оно оперирует относительными путями (т.е. нормально продумано). Если юзер указал иной каталог установки, то тогда этот каталог возможно будет целесообразным добавить в каталоги поиска (но это одна запись, а не отдельная под каждый чих).

Цитата: Дмитрий Загорулькин
Если использовать тот механизм, который предлагает Autodesk - Bundle-пакет, то я пока не могу представить, как можно сделать по другому.
Этой фразы я не понял. Т.е. ты не представляешь, как для Bundle-пакета можно обойтись без добавления новой записи в Support Files Search Path? В документации чётко прописан порядок поиска ресурсов новым механизмом, обрабатывающим такие плагины.
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: BearDyugin от 11-03-2016, 10:21:51
Я когда на LISP приложения писал, регистрационные данные в реестре хранил. Там же у меня были какие-то настройки, если для их хранения достаточно было одной переменной - строка, число и т.п. Хранил в HKCU/Software/<Мой раздел>/<Подразделы>. Это в качестве альтернативы.
Ни когда с реестром не работал, функции для этого знаю, но опыта не было. Да и полного понимания что такое реестр нет.
На первый взгляд кажется удобнее чем с файлами.
Есть какие-нибудь нюансы, ну типа куда писать нельзя, что писать нельзя, и как всё это может пропасть?
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: Андрей Бушман от 11-03-2016, 10:58:30
Есть какие-нибудь нюансы, ну типа куда писать нельзя, что писать нельзя, и как всё это может пропасть?
Безопасность реализована так же как в файловой системе - посредством ACL (https://ru.wikipedia.org/wiki/ACL).
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: Алексей Кулик от 11-03-2016, 12:00:18
Off-Topic: показать
Ни когда с реестром не работал, функции для этого знаю, но опыта не было. Да и полного понимания что такое реестр нет.
Для записи, чтения и прочего с реестром в лиспе см. функции vl-registry-read, vl-registry-write, vl-registry-delete, vl-registry-descendents. Весьма удобно работать.
Название: Re: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.
Отправлено: BearDyugin от 11-03-2016, 12:17:11
Весьма удобно работать.
Да, спасибо, уже почитал http://autolisp.ru/2011/04/11/data-set-and-get-03-2/
Вроде все понятно и просто, попробую, если вопросы возникнут спрошу.