我正在设计一个应用程序,允许您查找某些程序制作的图片(屏幕截图)。我将在应用程序本身中提供一些程序的位置以启动用户。
我想知道随着时间的推移我应该如何添加新位置,我的第一个想法就是将其硬编码到应用程序中,但这意味着用户必须重新安装才能使更改生效。
我的第二个想法是使用XML文件来包含所有位置以及其他数据,例如应用程序的名称。这也意味着用户可以根据自己的意愿添加自己的位置,也可以通过互联网分享。
第二个选项似乎是最好的方法,但后来我不得不考虑如何在用户计算机上管理它。理想情况下,我只想要一个.exe而不依赖于任何外部文件,例如XML,但这会让我回到第一点。
最好只使用ClickOnce部署在开始菜单中创建一个条目,并创建一个包含.exe和文件名的文件夹吗?
感谢您的反馈,我不想在设计被钉牢之前开始实施应用程序。
答案 0 :(得分:3)
通常我不会硬编码应用程序中的任何内容。正如你正确指出的那样,这就是一种不灵活的设计。
我通常将此类配置信息存储在Local Application Data文件夹下的XML文件中。
如果您的用户始终(或经常)与互联网连接,您可以考虑在网络服务上存储此类“书签”信息的替代(或其他)功能。
编辑:
这是我多年来用于此类事情的代码片段
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml.Serialization;
namespace JTools.IO.Configuration
{
public static class ConfigManager<T> where T : new()
{
private const string FILENAME = "Config.xml";
public static T Load()
{
return Load(ConfigFile);
}
public static T Load(string fileName)
{
T ret = default(T);
try
{
// Open file to read the data from
using (FileStream fs = new FileStream(fileName, FileMode.Open))
{
// Create an XmlSerializer object to perform the deserialization
XmlSerializer xs = new XmlSerializer(typeof(T));
// Use the XmlSerializer object to deserialize the data from the file
ret = (T)xs.Deserialize(fs);
}
}
catch (System.IO.DirectoryNotFoundException)
{
throw new Exception("Could not find the data directory '" + fileName + "'");
}
catch (System.IO.FileNotFoundException)
{
ret = new T();
}
return ret;
}
public static void Save(T config)
{
Save(config, ConfigFile);
}
public static void Save(T config, string fileName)
{
// Create file to save the data to
using (FileStream fs = new FileStream(fileName, FileMode.Create))
{
// Create an XmlSerializer object to perform the serialization
XmlSerializer xs = new XmlSerializer(typeof(T));
// Use the XmlSerializer object to serialize the data to the file
xs.Serialize(fs, config);
}
}
static private string configFile = null;
static public string ConfigFile
{
get
{
if (configFile == null)
{
string appName = typeof(T).FullName;
string baseFolder = System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
string jFolder = Path.Combine(baseFolder, "JToolsConfig");
string dataPath = Path.Combine(jFolder, appName);
if (!Directory.Exists(dataPath))
{
Directory.CreateDirectory(dataPath);
}
configFile = Path.Combine(dataPath, FILENAME);
}
return configFile;
}
}
}
}
答案 1 :(得分:2)
我将采用的方法是拥有一个Locations
类(和集合),我可以将其序列化为XML文件(使用XmlSerializer
或DataContractSerializer
)。
您可以检查XML文件是否存在 - 如果存在则将其反序列化到您的集合中,如果不存在,则可以使用硬编码的默认值创建新集合。
答案 2 :(得分:1)
我建议您以用户可读的方式组织所有数据,并询问用户他希望将其存储在计算机上的位置(使用一个或多个XML文件)。这样,用户可以将XML文件存储在他喜欢的任何地方,并了解他们的行为。他可以使用它们与他人共享他的“库”,他可以手动对这些XML文件应用更改,他甚至可以创建自己的程序,使用相同的文件(某种附加到你自己的程序)。