从其他程序运行程序时无法加载配置文件

时间:2016-06-03 05:16:20

标签: c# file process

我创建了一个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";

因此,当应用程序运行时,它将首先使用FileStreamXMLSerializer加载配置文件,如下所示:

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();

当我发现我的应用程序无法加载配置文件时,我感到很惊讶。序列化程序失败,表明文件不存在。但是如果我不是从观察者那里运行程序,而是直接运行应用程序,那么根本没有问题。

2 个答案:

答案 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.

现在没关系。