Где правильно хранить данные программы?

 
0
 
Delphi, Kylix and Pascal
ava
Rohoss | 17.01.2009, 02:07
К примеру, у меня есть программа, которую будут использовать несколько юзеров на одной машине. Программа, в процессе своей работы накапливает некоторые данные, с которыми работает сама, без вмешательства юзера. Тем не менее, для каждого юзера данные различные.
Мне известны два наиболее распространенных варианта, каждый из которых имеет свои недостатки:
1. Хранить данные в папке с программой. Пример qip. Тут недостаток в том, что любой юзер будет иметь доступ к файлам другого юзвера, кроме что ограничивать доступ вручную.
2. Второй вариан, как делают большинство программ, хранить данные в папке «Application Data» юзера. Этот вариант мне больше нравится, но он не лишен недостатков. При переустановки системы все данные пойдут на юг лесом.

А к примеру qip можно держать на другом разделе и даже не морочится с установкой. Да и настолько мне кажется философия .Net говорит в пользу первого варианта…


Какой по Вашему мнению вариант более правильный, или есть третий хороший вариант?
Ответы (26)
ava
Фантом | 17.01.2009, 02:32 #
Есть два нормальных варианта:

1) Хранить данные в папке "Application Data" юзера. Надеяться, что сисадмин компьютера, на котором установлена программа, не идиот, и перенес пользовательские профили на другой раздел, отличный от системного.

2) Пользоваться операционными системами с разумно организованной файловой системой (в которых от сисадмина не требуются проявления интеллекта для решения подобных задач). smile
ava
kemiisto | 17.01.2009, 02:40 #
Мне больше нравится первый вариант (правда, я не очень понимаю, причём тут "философия .NET"...). И указанный тобой недостаток
Цитата (Rohoss @ 17.1.2009, 00:07 findReferencedText)
любой юзер будет иметь доступ к файлам другого юзвера, кроме что ограничивать доступ вручную

во втором варианте тоже может присутствовать.

Цитата (Rohoss @ 17.1.2009, 00:07 findReferencedText)
При переустановки системы все данные пойдут на юг лесом.

:biggrin Старый добрый Windows...

Да, и ещё я не понимаю, зачем ограничивать доступ к данным, которые
Цитата (Rohoss @ 17.1.2009, 00:07 findReferencedText)
Программа, в процессе своей работы накапливает некоторые, с которыми работает сама, без вмешательства юзера.

:wacko

Добавлено позднее:
Цитата (Фантом @ 17.1.2009, 00:32 findReferencedText)
Надеяться, что сисадмин компьютера, на котором установлена программа, не идиот, и перенес пользовательские профили на другой раздел, отличный от системного.

Цитата (Фантом @ 17.1.2009, 00:32 findReferencedText)
Пользоваться операционными системами с разумно организованной файловой системой

:biggrin Вот, вот.
ava
Rohoss | 17.01.2009, 03:22 #
Цитата (kemiisto @ 17.1.2009, 02:40 findReferencedText)
любой юзер будет иметь доступ к файлам другого юзвера, кроме что ограничивать доступ вручнуюво втором варианте тоже может присутствовать. 

Там может иметь доступ разве что юзверь с учётной записью администратора.


Цитата (kemiisto @ 17.1.2009, 02:40 findReferencedText)
Да, и ещё я не понимаю, зачем ограничивать доступ к данным, которыеЦитата(Rohoss @  17.1.2009,  00:07 )Программа, в процессе своей работы накапливает некоторые, с которыми работает сама, без вмешательства юзера. 


Посмотри ту же папку «Application Data», там все данные такого типа. Если данные (файлы), предназначены для работы с ними юзверя, они хранятся в папке «Мои документы»
А почему к ним давать доступ кому попало?
ava
CodeMonkey | 17.01.2009, 10:53 #
Я за v2.

Если выбираешь вариант 1, то ты фактически вешаешь на своей программе крест для обычных (не продвинутых) пользователей.
И вот почему.
Потому что не продвинутый пользователь ставит программу в папку по-умолчанию, т.к. он не знает, как её сменить. А папка по-умолчанию - это Program Files. А Program Files - это только чтение для не админов - ок, в XP и ниже считай все работают админами (за исключением корпоративной среды) - а в Vista и выше - наоборот.
Соответственно, ваша программа не будет работать, если её устанавливать по-дефолту (практика "жми Next/Next/Next...").

P.S. Я, кстати, QIP сам не люблю за то, что он профили в папке с пользователями хранит. Вместо того, чтобы перетащить свой профиль на другую машину, мне теперь приходится по всему винту шерстить в поисках этих программ, которые хрен знает где хранят свои данные. Хорошо хоть Infium версия научилась делать правильно.

P.P.S. Ссылка в тему, ссылка в тему 2.

Добавлено позднее:
Цитата (kemiisto @ 17.1.2009, 02:40 findReferencedText)
Да, и ещё я не понимаю, зачем ограничивать доступ к данным, которые

Цитата(Rohoss @  17.1.2009,  00:07 )

Программа, в процессе своей работы накапливает некоторые, с которыми работает сама, без вмешательства юзера.

Тот же QIP: переписка с заказчиком, "волшебные" номера, явки, пароли... Извините, лучше я в папке AppData это буду хранить (ещё и атрибут шифрования накину), чем, скажем, в корне D ;)
ava
kemiisto | 17.01.2009, 11:42 #
Цитата (CodeMonkey @ 17.1.2009, 08:53 findReferencedText)
Тот же QIP: переписка с заказчиком, "волшебные" номера, явки, пароли...

CodeMonkey, и это по твоему без вмешательства юзера?

Добавлено позднее:
Цитата (Rohoss @ 17.1.2009, 01:22 findReferencedText)
Там может иметь доступ разве что юзверь с учётной записью администратора.

А я и сказал
Цитата (kemiisto @ 17.1.2009, 00:40 findReferencedText)
может присутствовать

а может и не присутствовать.

Добавлено позднее:
Цитата (Rohoss @ 17.1.2009, 00:07 findReferencedText)
или есть третий хороший вариант?

Да. И Фантом его уже озвучил - испоьзовать *nix системы! smile
ava
CodeMonkey | 17.01.2009, 12:29 #
Цитата (kemiisto @ 17.1.2009, 11:42 findReferencedText)
и это по твоему без вмешательства юзера?

Да, это я называю "без вмешательства пользователя". С моей точки зрения это данные, создаваемые программой автоматически. "С вмешательством" пользователя - это когда вы в текстовом редакторе что-то написали и выбрали "Сохранить как". А то, что эти данные ещё куда-то программа может скидывать - это уже другое дело.
А что тогда по-вашему без вмешательства юзера? Без вмешательства юзера компьютер даже не включится. Как насчёт водящего мыла? Это с вмешательством или без? Как насчёт кэша, где могут храниться критические данные. Это с вмешательством или без? Как насчёт автоматической БД thumbnails? Это с вмешательством или без?
Суть в том, что всё это - данные пользователя, а, следовательно, доступ к ним должен быть ограничен.
ava
Rohoss | 17.01.2009, 13:12 #
Я и сам за второй вариант. smile Ну всё же хотел убедиться в правильности выбора.
Всем спасибо, хотя дискуссию думаю можно и продолжить. smile
ava
CodeMonkey | 17.01.2009, 14:58 #
Вообще это зависит от обстоятельств. Например, многие программы предлагают две версии: стационарную или мобильную (или же одну, но при установке спрашивается, куда ставим: на машину или на флешку).
ava
OverFrosT | 19.08.2010, 18:22 #
Реестр:
- непереносимость между машинами
- помирает в случае падения винды
+ можно плодить копии проги с одним и тем же набором настроек
+ контроль доступа
+? по-майкрософтовски кошерно
+ возможность делать иерархию
+ возможность записывать бинарные данные

Ini
+ отличная переносимость
+ при падении винды легко скопировать
+ можно редактировать вручную (экспертные натстройки, которым не нашлось места в ГУЕ)
- сложно организовать иерархию
- сложно хранить бинарные данные (то есть, придётся кодировать в base64 или ещё как-нибудь)

Xml
+ все плюсы Ini
+ иерархия любой вложенности и сложности
- бинарные данные опять же в пролёте

контроль доступа в случае файлов ложится на файловую систему.

Хранение файла в папке с прогой:
+ прога самодостаточна, портабельна, легко переносится (в т.ч. на флешку или компакт)
- права доступа в XP+
- несколько юзеров юзают одни настройки

Хранение файла в AppData:
+ с правами доступа всё ОК (причем по дефолту)
+ у каждого юзера свои настройки
- прога не самодостаточна, при переносе нужно искать файл "где-то там"

В общем, мой выбор таков:
1) Файлы - однозначно. Формат файла определяется нуждами, глупо для линейного набора параметров "key=value" юзать XML.
2) При запуске проверка на наличие файла в папке с программой (либо любой другой способ указать программе, чтобы искала настройки рядом с собой - дополнительный файл seek_settings_here или portable.dat (а-ля AlReader и PDF-XChange Viewer) либо файл самых общих настроек, указывающий относительный путь к подпапке с персональными настройками (а-ля FileZilla) - не суть). Но делать ОБЯЗАТЕЛЬНО! Ибо портабельность рулит.
3) Если рядом с собой настроек не найдено - идти в AppData.

Именно такая схема используется в uTorrent, и я считаю её оптимальной. Она удовлетворяет двум самым важным аспектам: портабельности путём несложной настройки и многопрофильности+разграничению прав. Реестр в этом случае по некоторым аспектам идёт вровень, по некоторым - проигрывает.
ava
Qu1nt | 19.08.2010, 20:30 #
Цитата (OverFrosT @ 19.8.2010, 17:22 findReferencedText)
- бинарные данные опять же в пролёте

Base64.
ava
k0rvin | 19.08.2010, 20:50 #
Цитата (Rohoss @ 17.1.2009, 02:07)
2. Второй вариан, как делают большинство программ, хранить данные в папке «Application Data» юзера. Этот вариант мне больше нравится, но он не лишен недостатков. При переустановки системы все данные пойдут на юг лесом.

если юзер совсем нуб поставил прогу в "C:/Program Files", то и при первом варианте при переустановке системы все данные идут лесом. а домашний каталог можно и на другом разделе хранить, + мастер переноса файлов никто не отменял.
ava
CodeMonkey | 20.08.2010, 02:30 #
Некрофилы smile
ava
drkot | 23.08.2010, 23:38 #
Мммммда......
не дай бог Вам уважаемые писать коммерческий софт...

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

Добавлено позднее:
Судя по голосованию ~40% напишут софт не совместимый с вистой...
еще 40% сделают все чтобы сисадмин smile при попытке перенести данные пользователя.
остальные определятся в зависимости от солнечной активности... как им поступить...

что ж... это объективная реальность... удивляться тут нечему.

Application Data - это данные приложения! но не как ни пользователя! и я даже не знаю как бы я smile того smile который принес бы мне проект сохраняющий туда данные пользователя.

Всех злобным кодерам советую изучить структуру хранения данных в opera (браузер такой)... имхо один из лучших вариантов организации данных приложения и пользователя.
ava
Rohoss | 24.08.2010, 22:01 #
Цитата (drkot @ 23.8.2010, 23:38 findReferencedText)
Application Data - это данные приложения! но не как ни пользователя! и я даже не знаю как бы я    того    который принес бы мне проект сохраняющий туда данные пользователя.

Вы бы внимательно прочитали первый пост, а потом ругались бы.
Цитата (Rohoss @ 17.1.2009, 02:07 findReferencedText)
Программа, в процессе своей работы накапливает некоторые данные, с которыми работает сама, без вмешательства юзера. Тем не менее, для каждого юзера данные различные.


Вот именно, Application Data - это данные приложения, но для каждого пользователя они различны
ava
Matematik | 24.08.2010, 22:44 #
Цитата (drkot @ 23.8.2010, 23:38 findReferencedText)
соглашение для ос виндовс для разработчиков прикладных программ

этот документик?
Managing Roaming User Data Deployment Guide.doc
ava
OverFrosT | 25.08.2010, 16:21 #
Qu1nt,
Цитата (OverFrosT @ 19.8.2010, 18:22 findReferencedText)
- сложно хранить бинарные данные (то есть, придётся кодировать в base64 или ещё как-нибудь)


Цитата (k0rvin @ 19.8.2010, 20:50 findReferencedText)
если юзер совсем нуб поставил прогу в "C:/Program Files", то и при первом варианте при переустановке системы все данные идут лесом

Если бездумно форматят системный диск - то конечно, тут ничем не спасёшь. Но если юзер соображает, то файл куда легче скопировать через тот же LiveCD, что муторней намного в случае реестра (хотя и возможно). Правда, будут проблемы с правами доступа на NTFS.

Цитата (drkot @ 23.8.2010, 23:38 findReferencedText)
Application Data - это данные приложения! но не как ни пользователя! и я даже не знаю как бы я    того    который принес бы мне проект сохраняющий туда данные пользователя.Всех злобным кодерам советую изучить структуру хранения данных в opera (браузер такой)... имхо один из лучших вариантов организации данных приложения и пользователя.  

Хм.
Цитата
Paths

Preferences

C:\Documents and Settings\%username%\Application Data\Opera\Opera10_10\operaprefs.ini

Взаимоисключающие параграфы?
ava
Akella | 25.08.2010, 18:03 #
Цитата (Rohoss @ 24.8.2010, 22:01 findReferencedText)
Вот именно, Application Data - это данные приложения, но для каждого пользователя они различны

эта папка есть и в общем профиле
ava
Finalist | 25.08.2010, 21:08 #
а почему не хранить данные в локальной базе? Sqlite например...
пустую базу(дефолтную) запихнуть в ресурсы, и если нету в корне проги то создать... и после переустановки винды. и, поидее, с флешки будет работать.
Если данных мало, или они не сложные, можно в файл писать в папке с екзешником, заксорить потом, или во время записи\чтения.
игры так делают.. свой, самый простой вариант шифра. и уже проблематично данные достать...
В реестр писать надо только то, что актуально в текущей винде, до переустановки.. да и то, реестр такой жидкий,что вечно в нем какие-то ошибки и глюки.. чистить надо.
ava
Akella | 26.08.2010, 09:07 #
Зачем такие сложности? :dash1

Добавлено позднее:
Ааааа!! Я понял, настоящие герои программисты всегда идут в обход smile
ava
Finalist | 26.08.2010, 09:44 #
Человек беспокоится о
Цитата


недостаток в том, что любой юзер будет иметь доступ к файлам другого юзвера


а в зашифрованном файле долго разбираться где чьи данные. и я, не думаю, что это сложность)
или сложность это sql? стабильный движок работы с данными проще чем писать сериализацию данных. если конечно не использовать совсем простую сериализацию и запись в файл.
ava
drkot | 26.08.2010, 11:10 #
Цитата (Matematik @ 24.8.2010, 22:44 findReferencedText)
этот документик?

он самый

Rohoss,
пардон, много раз слово юзер упоминалось... переклинило... время то позднее было...

Цитата (Finalist @ 26.8.2010, 09:44 findReferencedText)
а в зашифрованном файле долго разбираться

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

ЗЫЖ при правильно настроеной политике безопасности проблем с утечками практически нет.
ava
Akella | 26.08.2010, 15:44 #
Цитата (Finalist @ 26.8.2010, 09:44)
Человек беспокоится о
Цитата



недостаток в том, что любой юзер будет иметь доступ к файлам другого юзвера




а в зашифрованном файле долго разбираться где чьи данные. и я, не думаю, что это сложность)

или сложность это sql? стабильный движок работы с данными проще чем писать сериализацию данных. если конечно не использовать совсем простую сериализацию и запись в файл.

Для этого в каждом профиле пользователя свои данные. На крайний случай, если все работают с одной программой и в одном профиле, то можно иметь несколько папок с настройками
ava
Finalist | 26.08.2010, 15:53 #
это уже пусть Rohoss, выбирает как лучше, ему делать)) я просто вариант предложил
ava
CodeMonkey | 26.08.2010, 17:51 #
Я думаю, что за полтора года он успел сделать выбор, не? smile
ava
Rohoss | 27.08.2010, 01:45 #
Цитата (Finalist @ 26.8.2010, 15:53 findReferencedText)
это уже пусть Rohoss, выбирает как лучше, ему делать)) я просто вариант предложил


Цитата (CodeMonkey @ 26.8.2010, 17:51 findReferencedText)
Я думаю, что за полтора года он успел сделать выбор, не?   


Угу smile . За это время я сделал выбор в сторону .net/c#, и ихней концепции хранения данных приложения тыц
ava
Motorocker | 27.09.2010, 17:31 #
Проголосовал:
Вариант 1 или 2, в зависимости от ситуации

Поддерживаю OverFrosT. При таком способе хранения настроек обычные пользователи лишаются проблем, а опытные получают портабельную программу.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить