c#在重启计算机后加载程序设置
c# load program settings after reboot computer
我在将设置加载到我的程序时遇到问题。系统重新启动后,程序会自动启动,但不会按应有的方式加载设置。但是,当我手动 运行 应用程序时,它会加载它们。
随系统启动程序
RegistryKey rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
rkApp.SetValue("Monitor", BaseDir+"\Monitor.exe");
Class负责加载设置
class MySettings : AppSettings<MySettings>
{
public string filePath = null;
public string interval = "0";
}
public class AppSettings<T> where T : new()
{
private const string DEFAULT_FILENAME = "settings.jsn";
public void Save(string fileName = DEFAULT_FILENAME)
{
File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(this));
}
public static void Save(T pSettings, string fileName = DEFAULT_FILENAME)
{
File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(pSettings));
}
public static T Load(string fileName = DEFAULT_FILENAME)
{
T t = new T();
if (File.Exists(fileName))
t = (new JavaScriptSerializer()).Deserialize<T>(File.ReadAllText(fileName));
return t;
}
}
我正在使用以下代码加载我的设置
MySettings settings = MySettings.Load();
string inter = settings.interval;
为什么设置只在重新启动应用程序后加载?
如果系统 运行 应用程序的工作目录与您手动 运行 时应用程序的工作目录不同,则可能会出现此问题。
解决此问题您可以指定设置文件的绝对路径。
您可以通过替换以下行来执行此操作:
private const string DEFAULT_FILENAME = "settings.jsn";
与:
private const string DEFAULT_FILENAME = @"C:\MyApplicationFolder\settings.jsn";
或:
private static readonly string DEFAULT_FILENAME = Path.Combine(Application.StartupPath, "settings.jsn");
如果需要更多帮助,请告诉我。
您还可以使用评论中提到的其他建议来解决您的问题。
更新
如果你因为某些原因不能使用Application.StartupPath
属性,你也可以使用:
private static readonly string DEFAULT_FILENAME = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "settings.jsn");
我也没有注意到你在你的方法中使用这个路径作为默认值。要使其工作,您可以尝试按照 Patrick 在评论中的建议更改 WorkingDirectory
或仅使用 null 作为默认值并在方法的主体中分配默认值,如下所示:
public void Save(string fileName = null)
{
AssignDefaultSettingsFilePathIfEmpty(ref fileName);
File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(this));
}
private void AssignDefaultSettingsFilePathIfEmpty(ref string fileName)
{
if (string.IsNullOrEmpty(fileName))
{
fileName = DEFAULT_FILENAME;
}
}
我在将设置加载到我的程序时遇到问题。系统重新启动后,程序会自动启动,但不会按应有的方式加载设置。但是,当我手动 运行 应用程序时,它会加载它们。
随系统启动程序
RegistryKey rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
rkApp.SetValue("Monitor", BaseDir+"\Monitor.exe");
Class负责加载设置
class MySettings : AppSettings<MySettings>
{
public string filePath = null;
public string interval = "0";
}
public class AppSettings<T> where T : new()
{
private const string DEFAULT_FILENAME = "settings.jsn";
public void Save(string fileName = DEFAULT_FILENAME)
{
File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(this));
}
public static void Save(T pSettings, string fileName = DEFAULT_FILENAME)
{
File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(pSettings));
}
public static T Load(string fileName = DEFAULT_FILENAME)
{
T t = new T();
if (File.Exists(fileName))
t = (new JavaScriptSerializer()).Deserialize<T>(File.ReadAllText(fileName));
return t;
}
}
我正在使用以下代码加载我的设置
MySettings settings = MySettings.Load();
string inter = settings.interval;
为什么设置只在重新启动应用程序后加载?
如果系统 运行 应用程序的工作目录与您手动 运行 时应用程序的工作目录不同,则可能会出现此问题。
解决此问题您可以指定设置文件的绝对路径。 您可以通过替换以下行来执行此操作:
private const string DEFAULT_FILENAME = "settings.jsn";
与:
private const string DEFAULT_FILENAME = @"C:\MyApplicationFolder\settings.jsn";
或:
private static readonly string DEFAULT_FILENAME = Path.Combine(Application.StartupPath, "settings.jsn");
如果需要更多帮助,请告诉我。
您还可以使用评论中提到的其他建议来解决您的问题。
更新
如果你因为某些原因不能使用Application.StartupPath
属性,你也可以使用:
private static readonly string DEFAULT_FILENAME = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "settings.jsn");
我也没有注意到你在你的方法中使用这个路径作为默认值。要使其工作,您可以尝试按照 Patrick 在评论中的建议更改 WorkingDirectory
或仅使用 null 作为默认值并在方法的主体中分配默认值,如下所示:
public void Save(string fileName = null)
{
AssignDefaultSettingsFilePathIfEmpty(ref fileName);
File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(this));
}
private void AssignDefaultSettingsFilePathIfEmpty(ref string fileName)
{
if (string.IsNullOrEmpty(fileName))
{
fileName = DEFAULT_FILENAME;
}
}