簡體   English   中英

重新啟動計算機后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 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");

如果需要更多幫助,請告訴我。

您也可以使用注釋中提到的其他建議來回答您的問題。

UPDATE

如果由於某種原因無法使用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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM