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

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

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

Возможно, пользователи регулярно обращаются к файлам журналов, поэтому %APPDATA% кажется немного сложным.

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

Ответы [ 9 ]

31 голосов
/ 06 ноября 2008

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

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

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

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

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

9 голосов
/ 19 мая 2010

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

string strPath=System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData);
8 голосов
/ 06 ноября 2008

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

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

6 голосов
/ 06 ноября 2008

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

5 голосов
/ 18 октября 2012

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

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

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

4 голосов
/ 06 ноября 2008

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

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

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

2 голосов
/ 06 ноября 2008

Вы можете использовать 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

1 голос
/ 06 ноября 2008

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

0 голосов
/ 06 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...