【发布时间】:2020-07-24 11:51:57
【问题描述】:
我编写了一个小的 WinForms 应用程序,它在启动时从位于 %APPDATA% 的文件中读取设置。如果设置文件不存在或无效,程序将使用硬编码的默认值。一切正常,直到我通过网络共享将我的应用程序复制到另一台 PC 或尝试直接从网络共享启动它。然后程序静默终止,我在事件日志中不断收到FileNotFoundException,尽管我有一个try/catch 块并且文件甚至存在!
感觉就像是某种许可的事情,因为它只发生在应用程序通过网络共享分发时,即使在我将所有内容复制到本地文件夹之后(没有任何来自 Windows 的投诉)。但是,该程序设法为设置文件创建文件夹,然后在尝试读取该文件时崩溃。
当我使用 USB 驱动器将程序复制到另一台 PC 时,一切正常。但这是我不喜欢的解决方法,而且它实际上并不能解决问题。
那么为什么不管文件是否存在它都会抛出FileNotFoundException?为什么异常没有被捕获而是终止程序呢?我该如何解决这个问题?
事件日志显示如下:
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.FileNotFoundException
at MyNamespace.Settings.Load()
at MyNamespace.Program.Main()
这里是一些代码sn-ps:
Program.cs
public static Settings Settings { get; private set; }
static void Main()
{
Settings = Settings.Load();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormMain());
}
Settings.cs
public static readonly string FileName;
static Settings()
{
string directoryName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MyProgram");
FileName = Path.Combine(directoryName, "Settings.json");
Directory.CreateDirectory(directoryName);
}
public static Settings Load()
{
try
{
string json = File.ReadAllText(FileName);
return JsonConvert.DeserializeObject<Settings>(json);
}
catch
{
return new Settings();
}
}
所有电脑都在 Windows 10 v1909 上运行。我正在使用 VS2019 Enterprise 16.6.5。
【问题讨论】:
-
您是否尝试过使用Process Monitor 并查找除 Settings.json 之外的其他无法找到的文件?
-
@ThomasWeller 你说得对。 (见我的回答。)
-
我很高兴这成功了。快乐编程。