我有一个需要存储用户数据的python桌面应用程序.在Windows上,这通常是%USERPROFILE%\Application Data\AppName\在OSX上,通常是~/Library/Application Support/AppName/在其他*nix上通常~/.appname/.
标准库中存在一个函数os.path.expanduser,它将为我提供用户的主目录,但我知道在Windows上,至少"应用程序数据"已本地化为用户的语言.OSX也可能如此.
获取此位置的正确方法是什么?
更新: 一些进一步的研究表明,在OSX上获得这个的正确方法是使用函数NSSearchPathDirectory,但这是Cocoa,所以它意味着调用PyObjC桥...
在我的系统上,%AppData%导致ApplicationData其中C:\Users\<USER>\AppData\Roaming
但也存在C:\Users\<USER>\AppData\Local
一些混乱D:\Users\<USER>\AppData\LocalLow
string local = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
string roaming = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
Run Code Online (Sandbox Code Playgroud)
我的问题是,我的应用程序应该在哪些位置保存其数据?
是否有使用这些地点的指南?如果我选择了错误的位置,我是否会让自己接受问题?
如何使用Settings(ApplicationSettingsBase)和依赖注入将所有配置文件代码保留在逻辑代码之外?
配置我指的是客户特定的配置文件.
我是否真的必须每次需要时注入一个配置类,还是有其他模式?
获得一些示例代码会很棒!
样品:
静态配置:
public static class StaticConfiguration
{
public static bool ShouldApplySpecialLogic { get; set; }
public static string SupportedFileMask { get; set; }
}
public class ConsumerOfStaticConfiguration
{
public void Process()
{
if (StaticConfiguration.ShouldApplySpecialLogic)
{
var strings = StaticConfiguration.SupportedFileMask.Split(',');
foreach (var @string in strings)
{
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
非静态配置:
public interface IConfiguration
{
bool ShouldApplySpecialLogic { get; set; }
string SupportedFileMask { get; set; }
}
public class Configuration : IConfiguration
{
public bool ShouldApplySpecialLogic …Run Code Online (Sandbox Code Playgroud) c# structuremap configuration dependency-injection application-settings
我在ResourceDictionary中定义我的设置和样式:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:properties="clr-namespace:Kavand.UI.Properties">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<properties:Settings x:Key="settings" />
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
<Style x:Key="PopupMenu_StackPanel">
<Setter Property="TextBlock.FontSize" Value="{Binding Source={StaticResource settings}, Path=Default.Font_Menu_Size}" />
<Setter Property="TextBlock.FontFamily" Value="{Binding Source={StaticResource settings}, Path=Default.Font_Menu_Family}" />
<Setter Property="TextBlock.FontWeight" Value="{Binding Source={StaticResource settings}, Path=Default.Font_Menu_Weight}" />
<Style.Resources>
<Style TargetType="{x:Type MenuItem}" BasedOn="{StaticResource KavandMenuItem}">
<Style.Triggers>
<Trigger Property="IsChecked" Value="true">
<Setter Property="IsEnabled" Value="false" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsChecked" Value="True" />
<Condition Property="IsHighlighted" Value="True" />
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="{DynamicResource K_Brush_Gray}" />
</MultiTrigger>
</Style.Triggers>
</Style>
</Style.Resources>
</Style>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
当我运行我的应用程序时,我收到错误:
'无法创建未知类型'{clr-namespace:Kavand.UI.Properties}设置'.' 行号"6"和行位置"14".
在调试应用程序时,在Visual Studio中启用了中断异常时,我总是会收到以下错误.这真是让我感到困扰,因为我们处理中断异常.有趣的是,当我继续(加载StringCollection)时它仍然有效.
消息是:
无法加载文件或程序集'System.XmlSerializers,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'或其依赖项之一.该系统找不到指定的文件.
这是导致异常的代码(设计器生成)
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public global::System.Collections.Specialized.StringCollection Mru {
get {
return ((global::System.Collections.Specialized.StringCollection)(this["Mru"]));
}
set {
this["Mru"] = value;
}
}
Run Code Online (Sandbox Code Playgroud)
我试图创建一个显示错误的空测试应用程序,但没有发生异常.我们的项目非常庞大,因此很难找到原因.也许这个网站上有人知道如何解决这个问题.
我有自定义网格控件的许多应用程序设置(在用户范围内).其中大多数是颜色设置.我有一个表单,用户可以自定义这些颜色,我想添加一个按钮,以恢复默认颜色设置.如何阅读默认设置?
例如:
CellBackgroundColor在Properties.Settings.CellBackgroundColor为Color.White使用IDE.CellBackgroundColor要Color.Black在我的计划.Properties.Settings.Default.Save().Restore Default Colors按钮.现在,Properties.Settings.Default.CellBackgroundColor回归Color.Black.我怎么回去Color.White?
我经常看到问题的答案如下:"我应该如何在我的.NET应用程序中存储设置?" 是通过手动将条目添加到app.config(或web.config)来编辑app.config文件,如下所示:
<configuration>
<appSettings>
**<add key="ConfigValueName" value="ABC"/>**
</appSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)
然后,访问它们像:
string configValue = Configuration.AppSettings["ConfigValueName"];
Run Code Online (Sandbox Code Playgroud)
我将上面概述的方法称为"app.config"方法.我很少看到人们建议在项目中添加"设置"文件.我已经在网络上和堆栈溢出中看到了这么多次...我开始怀疑我是否遗漏了某些东西......因为我不确定为什么你使用这种方法而不是使用"设置" "档案.我没有进入.NET直到VS2005所以我有一个理论是这是VS2003中的事情是如何完成的,人们从未切换过?
推荐app.config方法的人的示例:
从我的观点来看,"设置文件"方法有以下优点:
propertyGrid1.SelectedObject = Settings1.Default;就是你已经完成了.如果您不确定"设置"文件方法的含义,请参阅此帖子,这是有人建议使用设置文件而不是app.confg的少数示例之一.
编辑:请理解:本主题的目的是弄清楚为什么人们会使用上面概述的app.config方法而不是设置文件方法.我遇到了设置文件方法的限制,并且有时被迫推出自己的自定义解决方案.这是一个完全不同的讨论.
每次我编译我的应用程序并且版本号更改(我有一个自动递增的内部版本号),我将丢失用户配置的app.config设置,因为它们存储在特定版本的AppData文件夹中.基本上,就用户设置而言,我的应用程序的每个版本都从头开始.
虽然这对开发来说是一个轻微的烦恼,但是当我接近部署/发布时它会引发一个问题 - 如果我使用app.config存储我的用户设置,那么每次安装修改版本的补丁时都会对用户的个性化设置进行管理我的应用号码?如果是这样,是否有一种简单的方法可以从以前的版本"升级"设置?我知道在注册表中使用HKCU是另一种选择,但我喜欢My.Settings命名空间的简易性,我想继续使用app.config.
早在九十年代,微软推出了Windows注册表.应用程序可以将设置存储在不同的配置 有适用于应用程序范围和用户特定范围的配置单元,这些范围放置在适当的位置,以便漫游配置文件正常工作.
在.NET 2.0及更高版本中,我们有一个名为Application Settings的东西.应用程序可以使用它们来存储XML文件,app .exe.config和user .config中的设置.这些适用于应用程序范围和用户特定的范围,并且这些范围放置在适当的位置,以便漫游配置文件正常工作.
听起来有点熟?这些应用程序设置由XML文件支持的原因是什么,而不是简单地使用注册表?这不是注册表的目的吗?
我能想到的唯一原因是注册表是特定于Windows的,而.NET试图与平台无关.这是一个(或那个)原因,还是有其他我忽视的考虑因素?
现在我在ini文件中的这些设置是:
-Xms768M -Xmx1024M
当设置它们更高时,eclipse不再启动了......有没有办法在没有eclipse崩溃的情况下增加这些值?