Лучшее место для хранения файлов конфигурации и файлов журнала в Windows для моей программы?

Мне нужно хранить файлы журналов и файлы конфигурации для моего приложения. Где лучше всего их хранить?

Прямо сейчас я просто использую текущий каталог, который в конечном итоге помещает их в каталог Program Files, в котором находится моя программа.

Пользователь, вероятно, будет получать доступ к файлам журнала довольно регулярно, поэтому до %APPDATA% кажется немного сложнее.

Каталог под %USERPROFILE%\My Documents самый лучший? Он должен работать для всех версий Windows, начиная с 2000 года.

См. Также этот вопрос

Dimitri C. 17.08.2010 11:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
54
1
29 728
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Я использую Изоляционное хранилище для настройки. Вы также можете использовать папку Темп для хранения временной информации, такой как журнал.

Это твое мнение. Журнал должен быть временным ... может зависеть от вашего приложения.

Patrick Desjardins 06.11.2008 22:58

и я бы сказал, что «Журналы должны быть временными» - это тоже ваше мнение.

Dylan Hayes 18.10.2012 17:50

и три с половиной года спустя я возвращаюсь сюда и вижу это обсуждение. @DylanHayes, очевидно, прав - файлы журналов особенно полезны после того, как программа остановила свою работу, и нет абсолютно никакой гарантии, что какие-либо файлы до того, как это произошло, все еще будут находиться во временной папке. Так что нет, журналы нет должны быть временными; вы можете иметь в виду что-то вроде «информация о состоянии».

Marcus Müller 09.05.2016 16:34

Лучший ответ зависит от характера журналов и конфигураций. Если они охватывают всю программу и не нуждаются в сохранении после удаления приложения, то я думаю, что они в порядке там, где они есть. Если журналы и конфигурации относятся к конкретному пользователю или нуждаются в сохранении после удаления, то они принадлежат где-то в% USERPROFILE% -% APPDATA%, являясь «правильным» базовым каталогом для этого типа вещей.

Не храните файлы конфигурации в папке приложения, Microsoft заявила, что это НЕ идеальное место. Windows движется к блокировке записи в C: \ Program Files \, и вы обнаружите, что в Vista любое приложение, которое пытается писать сюда, выдает предупреждение UAC.

Windows 7 позволит пользователям настраивать, какие всплывающие окна UAC они используют (ожидайте, что некоторые опытные пользователи заблокируют большинство из них), и ваше приложение выйдет из строя / зависнет, если пользователь никогда не одобрит эту попытку записи.

Если вы используете правильные переменные userprofile и appdata, то Win 2000, XP, Vista и Win7 сопоставят данные с правильной удобной для записи папкой без всплывающих окон UAC.

Для настроек приложения - используйте System.Environment.SpecialFolder.ApplicationData - здесь хранятся данные перемещаемого профиля, поэтому он позволяет вашему пользователю входить и работать с разных компьютеров в домене.

Для файлов журнала - System.Environment.SpecialFolder.LocalApplicationData

Честно говоря,% appdata% по-прежнему является лучшим местом для размещения ваших файлов конфигурации и файлов журнала, поскольку он служит в качестве заполнителя для хранения данных вашего приложения. Доступ к нему не должен быть таким сложным, просто введите% appdata% в проводнике, и вы будете перенаправлены прямо в каталог% appdata%.

Классный трюк ... Я не знал об этом ярлыке% appdata%. +1

David Rutten 26.09.2009 08:20

Вы можете использовать SHGetSpecialFolderPath:

int MAX_PATH = 255;

CString m_strMyPath;

SHGetSpecialFolderPath(NULL, m_strMyPath.GetBuffer(MAX_PATH), CSIDL_COMMON_APPDATA, TRUE);

Это будет указывать на «специальный путь к папке», в которую вы можете безопасно записывать журналы для Windows:

Для XP: C:\Documents and Settings\All Users\Application Data

Для Vista: C:\ProgramData

Проверьте страницу MSDN здесь: http://msdn.microsoft.com/en-us/library/bb762204(VS.85).aspx

Ответ принят как подходящий

Если вы не используете ConfigurationManager для управления своим приложением и пользовательскими настройками, вам следует это сделать. Набор инструментов конфигурации в .NET Framework замечательно продуман, как и инструменты Visual Studio, которые с ним взаимодействуют.

По умолчанию ConfigurationManager помещает как неизменные (приложение), так и изменяемые (пользовательские) настройки в нужные места: настройки приложения помещаются в папку приложения, а пользовательские настройки - в System.Environment.SpecialFolder.LocalApplicationData. Он правильно работает во всех версиях Windows, поддерживающих .NET.

Что касается файлов журнала, System.Environment.SpecialFolder.LocalApplicationData - это обычно то место, куда вы хотите их поместить, потому что он гарантированно доступен для записи пользователем.

Конечно, есть случаи, когда вы этого не сделаете - например, если вы хотите записать файлы в общий сетевой ресурс, чтобы вы могли легко получить к ним удаленный доступ. Существует довольно широкий спектр способов реализовать это, но большинство из них начинается с создания параметра приложения, содержащего путь к общей папке. Все они связаны с администрацией.

У меня есть пара жалоб на ConfigurationManager и инструменты VS: нужна лучшая высокоуровневая документация, чем есть, и лучшая документация для класса Settings, созданного VS. Механизм, с помощью которого файл app.config превращается в файл конфигурации приложения в целевом каталоге сборки, непрозрачен (и является источником одного из наиболее часто задаваемых вопросов: «что случилось с моей строкой подключения?»). И если есть способ создания настроек, не имеющих значений по умолчанию, я его не нашел.

Использование System.Environment.SpecialFolder.LocalApplicationData для настроек конфигурации имеет один недостаток - он не реплицируется с перемещаемым профилем, если пользователь находится в такой среде. И у меня был плохой опыт с этим, когда мне позже пришлось модифицировать свое приложение, когда у меня появились такие пользователи.

Sunny Milenov 07.11.2008 18:53

В зависимости от того, что вы регистрируете. Если журналы относятся к выполнению пользователями, используйте Environment.SpecialFolder.LocalApplicationData. Если вы просто регистрируете общую статистику приложения, я бы рекомендовал использовать Environment.SpecialFolder.CommonApplicationData

Tal Even-Tov 27.03.2013 16:24

Примечание. Вы можете получить путь к папке LocalApplicationData в .NET с помощью следующей функции:

string strPath=System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData);

В принятом ответе отмечается, что для файлов журнала подходит следующее. System.Environment.SpecialFolder.LocalApplicationData Это соответствует пути к C:\Users\[User]\AppData\Roaming, который, как вы можете видеть, зависит от пользователя. Как и в принятом ответе, это гарантированное место для записи пользователем и может быть полезно в определенных ситуациях.

Однако в среде веб-приложений вы можете запускать свое приложение под сетевой учетной записью, и вам или вашему коллеге может потребоваться попытаться отследить, где именно эти журналы ведутся для каждого приложения. Мне лично нравится использовать перечисление местоположения, не зависящее от пользователя, System.Environment.SpecialFolder.CommonApplicationData, который приравнивается к C:\ProgramData. Да, вам нужно будет указать права доступа для любых создаваемых вами папок, но обычно это разовая сделка, и тогда все журналы ваших приложений могут находиться в одном удобном месте.

Вдобавок, поискав в Интернете, есть проект, который программно устанавливает права на запись в папки, которые вы создаете в CommonApplicationData, Разрешить доступ на запись / изменение к CommonApplicationData.

Другие вопросы по теме