Мне нужно хранить файлы журналов и файлы конфигурации для моего приложения. Где лучше всего их хранить?
Прямо сейчас я просто использую текущий каталог, который в конечном итоге помещает их в каталог Program Files, в котором находится моя программа.
Пользователь, вероятно, будет получать доступ к файлам журнала довольно регулярно, поэтому до %APPDATA% кажется немного сложнее.
Каталог под %USERPROFILE%\My Documents самый лучший? Он должен работать для всех версий Windows, начиная с 2000 года.





Я использую Изоляционное хранилище для настройки. Вы также можете использовать папку Темп для хранения временной информации, такой как журнал.
Это твое мнение. Журнал должен быть временным ... может зависеть от вашего приложения.
и я бы сказал, что «Журналы должны быть временными» - это тоже ваше мнение.
и три с половиной года спустя я возвращаюсь сюда и вижу это обсуждение. @DylanHayes, очевидно, прав - файлы журналов особенно полезны после того, как программа остановила свою работу, и нет абсолютно никакой гарантии, что какие-либо файлы до того, как это произошло, все еще будут находиться во временной папке. Так что нет, журналы нет должны быть временными; вы можете иметь в виду что-то вроде «информация о состоянии».
Лучший ответ зависит от характера журналов и конфигураций. Если они охватывают всю программу и не нуждаются в сохранении после удаления приложения, то я думаю, что они в порядке там, где они есть. Если журналы и конфигурации относятся к конкретному пользователю или нуждаются в сохранении после удаления, то они принадлежат где-то в% 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
Вы можете использовать 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 для настроек конфигурации имеет один недостаток - он не реплицируется с перемещаемым профилем, если пользователь находится в такой среде. И у меня был плохой опыт с этим, когда мне позже пришлось модифицировать свое приложение, когда у меня появились такие пользователи.
В зависимости от того, что вы регистрируете. Если журналы относятся к выполнению пользователями, используйте Environment.SpecialFolder.LocalApplicationData. Если вы просто регистрируете общую статистику приложения, я бы рекомендовал использовать Environment.SpecialFolder.CommonApplicationData
Примечание. Вы можете получить путь к папке 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.
См. Также этот вопрос