2008-08-25 128 views
52

我有一个.NET 2.0 Windows窗体应用程序。商店用户设置的最佳位置在哪里(考虑Windows指南)?有人指出Application.LocalUserAppDataPath。然而,创建一个文件夹结构,如:为.NET应用程序存储用户设置的最佳方式是什么?

C:\的Documents and Settings \用户名\本地设置\应用 数据\ COMPANY_NAME \ PRODUCT_NAME \ PRODUCT_VERSION \

如果我发布1的版本我应用程序并在其中存储XML文件,然后发布版本2,该版本将更改为不同的文件夹,对吗?无论应用程序版本如何,我都希望每个用户都有一个文件夹来存储设置。

+0

我觉得[这篇文章]涵盖了解决方案。 – 2008-08-25 16:50:42

+0

[更新链接](https://blog.kowalczyk.info/article/10b/Getting-user-specific-application-data-directory.html)从Jorges评论。 – tm1 2016-05-19 09:39:06

回答

74

我喜欢使用内置的Application Settings。然后,你已经建立了使用设置设计器支持,如果你想在设计时,或在运行时使用:

// read setting 
string setting1 = (string)Settings.Default["MySetting1"]; 
// save setting 
Settings.Default["MySetting2"] = "My Setting Value"; 

// you can force a save with 
Properties.Settings.Default.Save(); 

它确实存储在一个类似的文件夹结构设置为你描述(与版本路径)。然而,一个简单的调用:

Properties.Settings.Default.Upgrade(); 

的应用将拉动所有先前版本的设置在保存

已经对我在过去的工作
+1

感谢您的升级()提示。 – 2008-09-19 20:20:27

1

设置是标准键值对(字符串字符串)。如果有帮助,我可以将它们包装在一个XML文件中。

我宁愿使用文件系统而不是注册表。这似乎更容易维护。在支持情况下,如果用户需要手动打开/更改设置,那么如果它在文件系统中会更容易。

0

我会沿着您发布的文件夹列表,除了产品版本。更新发布后,您不希望重置设置。

由于调试/占用空间的因素,我实际上正在远离用户设置的注册表。我目前只在注册表中存储的一些基本设置(窗口大小,位置,数据文件的版本),我如果更新变坏或用户丢失了第二台显示器遇到更多的问题,而这正是该应用程序正在开放。他们中的一些人精通理解注册表,但其余的他们必须重新安装,这很快,但我认为他们有点抱怨。使用基于文件的版本,我所要做的就是让他们在记事本中打开一个XML文件并进行快速调整。

此外,我正在寻找使我的应用程序可以运行在USB闪存驱动器上,并将设置绑定到文件中似乎对该过程更友善。我确定我可以做一些代码来检查/清理注册表,但我认为我们大多数人已经厌倦了现在似乎吃掉我们机器的注册表混乱。

我知道有一些安全的权衡这一点,但没有我对数据进行排序的是,这一事业的关键,我没有任何痛苦的表现,由于应用程序的大小命中。

2

一种方法是创建一个设置类。使用XML序列化将其写入文件系统。您可以通过创建一系列设置对象并对其进行序列化来扩展此概念。您可以在一个位置为所有用户提供所有设置,而无需担心管理文件系统。

在任何人给我任何部分重新发明方向盘之前,让我说几件事情。首先,它只是几行代码来序列化和写入文件。其次,如果你有一个包含您设置一个对象,你不必做,当你加载你的应用程序到的appSettings多次调用对象。最后,这是很容易的添加代表您的应用程序状态的项目,从而使你恢复时,应用程序加载下一个长时间运行的任务。

4

或者将您的设置写入xml文件并使用Isolated Storage进行保存。根据您使用的商店将其保存在Application Data文件夹中。您也可以选择启用漫游的商店,这意味着当用户登录不同的计算机时,设置随之移动。

0

隔离存储主要用于使用ClickOnce分发的应用程序,并在安全沙箱中运行。基本路径是为您决定的,您将无法在您的代码中推论出它。该路径将是类似于 “\ LocalSettings \的ApplicationData \ IsolatedStorage \ ejwnwe.302 \ kfiwemqi.owx \ url.asdaiojwejoieajae ......”,不是所有的友好。您的存储空间也很有限。

Ryan Farley has it right

7

.NET应用程序有一个内置的设置机制,很容易使用。它的问题,在我看来,就是它保存这些设置断成默默无闻的目录和最终用户将无法找到它。而且,只是从调试切换到发布构建会更改此目录的位置,这意味着保存在一个配置中的任何设置都会丢失。

由于这些和其他原因,我想出了my own settings code for Windows Forms。它不像.NET中那样光滑,但它更加灵活,并且我一直都在使用它。

1

我尝试了一些方法来存储我的设置,以简单的文本文件,我发现最好的方式:存储在应用程序文件夹

文件,使用情况,SETTINGS.TXT: (内设置文件批准的意见,尝试//注释)

//获取设置数值

Settings.Get("name", "Ivan"); 

//设置设置数值

Settings.Set("name", "John"); 

使用:

using System; 
using System.Collections.Generic; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Windows.Forms; 

//你可以用部分名字还可以存储,使用只需加名节套装(SECTION_NAME,名称,值)和获取(SECTION_NAME,名称,值)

public static class Settings 
{ 
    private static string SECTION = typeof(Settings).Namespace;//"SETTINGS"; 
    private static string settingsPath = Application.StartupPath.ToString() + "\\settings.txt"; 
    [DllImport("kernel32")] 
    private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); 
    [DllImport("kernel32")] 
    private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); 
    public static String GetString(String name) 
    { 
     StringBuilder temp = new StringBuilder(255); 
     int i = GetPrivateProfileString(SECTION,name,"",temp,255,settingsPath); 
     return temp.ToString(); 
    } 
    public static String Get(String name, String defVal) 
    { 
     return Get(SECTION,name,defVal); 
    } 
    public static String Get(string _SECTION, String name, String defVal) 
    { 
     StringBuilder temp = new StringBuilder(255); 
     int i = GetPrivateProfileString(_SECTION, name, "", temp, 255, settingsPath); 
     return temp.ToString(); 
    } 
    public static Boolean Get(String name, Boolean defVal) 
    { 
     return Get(SECTION, name, defVal); 
    } 
    public static Boolean Get(string _SECTION, String name, Boolean defVal) 
    { 
     StringBuilder temp = new StringBuilder(255); 
     int i = GetPrivateProfileString(_SECTION,name,"",temp,255,settingsPath); 
     bool retval=false; 
     if (bool.TryParse(temp.ToString(),out retval)) 
     { 
      return retval; 
     } else 
     { 
      return retval; 
     } 
    } 
    public static int Get(String name, int defVal) 
    { 
     return Get(SECTION, name, defVal); 
    } 
    public static int Get(string _SECTION, String name, int defVal) 
    { 
     StringBuilder temp = new StringBuilder(255); 
     int i = GetPrivateProfileString(SECTION,name,"",temp,255,settingsPath); 
     int retval=0; 
     if (int.TryParse(temp.ToString(),out retval)) 
     { 
      return retval; 
     } else 
     { 
      return retval; 
     } 
    } 
    public static void Set(String name, String val) 
    { 
     Set(SECTION, name,val); 
    } 
    public static void Set(string _SECTION, String name, String val) 
    { 
     WritePrivateProfileString(_SECTION, name, val, settingsPath); 
    } 
    public static void Set(String name, Boolean val) 
    { 
     Set(SECTION, name, val); 
    } 
    public static void Set(string _SECTION, String name, Boolean val) 
    { 
     WritePrivateProfileString(_SECTION, name, val.ToString(), settingsPath); 
    } 
    public static void Set(String name, int val) 
    { 
     Set(SECTION, name, val); 
    } 
    public static void Set(string _SECTION,String name, int val) 
    { 
     WritePrivateProfileString(SECTION, name, val.ToString(), settingsPath); 
    } 
} 
相关问题