Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.

Автор Тема: Поиск места, куда можно записать(а потом и найти) файлик на машине пользователя.  (Прочитано 19198 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн BearDyuginАвтор темы

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
В общем, почти все мои приложения записывают маленькие вспомогательные файлики на компьютер пользователя, какие для записи настроек приложения, какие с записью регистрационных данных.
Место для записи искал так
Код - 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

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

Ну и как быть? Можно ли положиться только на ROAMABLEROOTPREFIX или искать например не acad.pat, который лежит и там и там, а скажем, acad.cuix ?
« Последнее редактирование: 23-01-2016, 07:54:32 от Geobuilder »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
или искать например не 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"

Для начала хватит? :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн BearDyuginАвтор темы

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
Для начала хватит?
Хватит, спасибо.
Но меня мучает вопрос, зачем Lee подстраховывался? в каком случаи любая из этих системных переменных может быть nil, лишь в том случаи, если это относительно новая переменная и в ранних версиях AutoCAD её не было?

Оффлайн BearDyuginАвтор темы

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
"C:\\Users\\Rivilis-AN"
"C:\\Users\\Rivilis-AN\\AppData\\Local"
"C:\\Users\\Rivilis-AN\\AppData\\Roaming"
Опять же проверил, все эти папки не содержат файлов, только папки, как то паливо туда файлы писать   :-\

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
В общем, почти все мои приложения записывают маленькие вспомогательные файлики на компьютер пользователя, какие для записи настроек приложения, какие с записью регистрационных данных.
Место для записи искал так
Код - Auto/Visual Lisp [Выбрать]
  1. (findfile "acad.pat")
Почему не хочешь для хранения своих вспомогательных файлов прописывать полный путь, вместо того, чтобы завязываться на расположение акадовских файлов? Например так: %AppData%\Geobuilder\<AppName>\tmp\.

Цитата: Geobuilder
все эти папки не содержат файлов, только папки, как то паливо туда файлы писать   :-\
А непосредственно в них файлы писать и не нужно. Создавай нужную тебе структуру подкаталогов и используй её по своему усмотрению. Принято в %AppData% (как и в %ProgramData%, %ProgramFiles%) подкаталоги формировать по правилу: %AppData%\<CompanyName>\<ApplicationName>\.

Оффлайн BearDyuginАвтор темы

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
Почему не хочешь для хранения своих вспомогательных файлов прописывать полный путь
Никогда не думал об этом, у кого-то давно в коде встретил, как вообще файлы создавать так и делал.
Всё же файл с сохранением пользовательских настроек думаю стоит привязывать к конкретному AutoCAD-у.
А файл с регистрацией приложения, хотелось тоже писать более не заметно, чем создавать каталог <CompanyName>.
В целом спасибо за совет.
И как я уже проверил Autolisp не понимает
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-mkdir "%AppData%\\CompanyName")
только так   
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-mkdir (strcat (getenv "APPDATA") "\\CompanyName"))

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
в каком случаи любая из этих системных переменных может быть nil, лишь в том случаи, если это относительно новая переменная и в ранних версиях AutoCAD её не было?
Именно так. В ранних версиях этой переменной не было
Цитата: Александр Ривилис от 22-01-2016, 19:19:13

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

Опять же проверил, все эти папки не содержат файлов, только папки, как то паливо туда файлы писать   :-\
У меня там есть и файлы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Всё же файл с сохранением пользовательских настроек думаю стоит привязывать к конкретному AutoCAD-у.
Ну так ты можешь, при желании разносить настройки по разным файлам в твоём каталоге, либо группировать их в рамках одного и того-же конфиг-файла.

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

Если в акадовский каталог будут писать файлы разные расширения от разных разработчиков, вместо того, чтобы распределять их по подкаталогам согласованной структуры, то этот каталог очень быстро превратится в помойку, в которой трудно будет разобраться. А это самое "разобраться" может понадобиться в том случае, если вдруг возникнут проблемы (например, после загрузки очередного плагина, акад стал работать как инвалид), т.к. не понятно, какие файлы в каталоге акадовские, а какие "левые" (чтобы удалить ненужный контент, закинутый кривым плагином).

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если в акадовский каталог будут писать файлы разные расширения от разных разработчиков, вместо того, чтобы распределять их по подкаталогам согласованной структуры, то этот каталог очень быстро превратится в помойку, в которой трудно будет разобраться.
Согласен абсолютно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн BearDyuginАвтор темы

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
не понятно, какие файлы в каталоге акадовские, а какие "левые" (чтобы удалить ненужный контент, закинутый кривым плагином).
Всё, понял, не буду.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
как я уже проверил Autolisp не понимает
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-mkdir "%AppData%\\CompanyName")

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

Если для какого-то набора файлов тебе нужен не переносимый локальный профиль (см. по обстоятельствам), то вместо %AppData% можно использовать %LocalAppData%.

Оффлайн BearDyuginАвтор темы

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
Off-Topic: показать
Я честно очень вам всем благодарен, и даже понимаю вас, это тут я нуб, среди программистов. А на геодезическом форуме я очень даже специалист, и иногда вопросы новичков ставят в тупик, вопрос очень простой, но ты даже не знаешь с чего начать объяснять...

будет разворачивать имя переменной, присутствующей в составе пути, в её значение
не переносимый локальный профиль
Я пять раз прочитал, но всё равно не понял  :o т.е. как бы вроде всё по-русски и о простом, и не самое важное, принципиальный ответ уже был выше...
Мне очень нравятся ответы Горлова Николая, они и улыбку вызывают стилем написания и понятно всё как на пальцах  :D

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я пять раз прочитал, но всё равно не понял
Есть официальный термин в Microsoft Windows: "Перемещаемый профиль"
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Я пять раз прочитал, но всё равно не понял  :o т.е. как бы вроде всё по-русски и о простом, и не самое важное, принципиальный ответ уже был выше...
Мне очень нравятся ответы Горлова Николая, они и улыбку вызывают стилем написания и понятно всё как на пальцах  :D
На пальцах, говоришь... Попробую.

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

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

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

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

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

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

как бы вроде всё по-русски и о простом, и не самое важное, принципиальный ответ уже был выше...
Ну как сказать... Понимать то, куда какую информацию лучше записывать, учитывая специфику переносимого и непереносимого профиля - это не так уж и "не самое важное". ИМХО.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Я когда на LISP приложения писал, регистрационные данные в реестре хранил. Там же у меня были какие-то настройки, если для их хранения достаточно было одной переменной - строка, число и т.п. Хранил в HKCU/Software/<Мой раздел>/<Подразделы>. Это в качестве альтернативы.
А что касается файлов с данными:
Либо просил пользователя задать путь к ним с помощью диалога. То есть, пользователь мог сделать несколько файлов с данными, хранить их в любом удобном для него месте и подгружать тот, который ему нужен в данный момент. Абсолютный путь к текущему файлу с данными сохранял в реестре в переменной.
Либо в папке рядом с LSP-файлом делал подпапки для файлов данных. Папка, в которой лежал LISP, при установке прописывалась в путь поддержки, а потом, опираясь на этот путь, искались данные для программы. Если грубо и без проверок, то как-то так: (strcat (findfile "myApp.lsp") "\\Data\\Settings.ini")
Сейчас,в .NET я храню данные в %APPDATA%/<Моя папка>, как и советуют уважаемые коллеги :).