我创建了一个WinFrom
应用,版本.exe
位于特定目录中,比方说,
C:\App\bin\Release\WinFormApp.exe
在应用程序目录中,我有一些以XML
格式编写的配置文件,并存储在目录的Config
子文件夹中:
C:\App\bin\Release\Config\MyConfig1.xml
C:\App\bin\Release\Config\MyConfig2.xml
C:\App\bin\Release\Config\MyConfig3.xml
然后我在应用程序的private field
文件中有一个.cs
,其中存储了配置文件所在的默认子目录名称:
private string configFoldername = "Config";
因此,当应用程序运行时,它将首先使用FileStream
和XMLSerializer
加载配置文件,如下所示:
filestream = new FileStream(Path.Combine(configFoldername, "MyConfig1.xml"), FileMode.Open, FileAccess.Read, FileShare.Read);
serializer = new XmlSerializer(typeof(MyAppConfig1));
//... some others
filestream = new FileStream(Path.Combine(configFoldername, "MyConfig2.xml"), FileMode.Open, FileAccess.Read, FileShare.Read);
serializer = new XmlSerializer(typeof(MyAppConfig2));
//... some others
filestream = new FileStream(Path.Combine(configFoldername, "MyConfig3.xml"), FileMode.Open, FileAccess.Read, FileShare.Read);
serializer = new XmlSerializer(typeof(MyAppConfig3));
//... some others
到目前为止一切顺利。应用程序运行没有问题。但后来我为我的应用程序创建了一个简单的watcher
程序来检查它是否运行良好,如果不是,那么观察者将重新启动该程序。我watcher
计划中的相关部分如下所示:
//In the Watcher program
Process process = new Process();
process.StartInfo.FileName = @"C:\App\bin\Release\WinFormApp.exe";
process.Start();
当我发现我的应用程序无法加载配置文件时,我感到很惊讶。序列化程序失败,表明文件不存在。但是如果我不是从观察者那里运行程序,而是直接运行应用程序,那么根本没有问题。
答案 0 :(得分:1)
尝试替换:
private string configFoldername = "Config";
使用:
private string configFoldername = Path.Combine(Application.StartupPath, "Config");
或设置process.StartInfo.WorkingDirectory
:
process.StartInfo.WorkingDirectory = @"C:\App\bin\Release\";
答案 1 :(得分:0)
问题出在FileStream
电话:
filestream = new FileStream(Path.Combine(configFoldername, "MyConfig1.xml"), FileMode.Open, FileAccess.Read, FileShare.Read);
给定的路径是使用相对路径,只给出configFoldername
而不是完整路径。
因此,令人惊讶,当WinForm
程序从另一个程序(Watcher
)运行时,FileStream
默认路径将是{{1}我的应用程序路径而不是Watcher
的应用程序路径,并使WinForm
无法从正确的文件夹中获取该文件。
要解决它,我使用绝对路径而不是相对路径。在FileStream
应用的初始化中,我使用WinForm
来获取Application.StartupPath
应用的绝对路径。
WinForm
然后新的反序列化看起来像这样:
private string configFoldername = "Config";
private string configFolderpath; //declare new variable here
...and in the initialization
string root = Application.StartupPath;
configFolderpath = Path.Combine(root, configFoldername); //making this having the absolute path.
现在没关系。