私のコンピューターにある既存の XML ファイルから、同じコンピューターにある別の XML ファイルに特定のノードをコピーする、非常に単純な C# コンソール アプリケーションがあります。ソリューション内の app.config ファイルにパスをハードコーディングしました。
ソリューションをデバッグすると (F5)、ファイルが適切に更新されます。ただし、デバッグなしで実行した場合 (Control+F5)、または bin/Release または bin/Debug にビルド (または公開) して my-console-app.exe を実行すると、アプリケーションはファイルをディスクに保存できません。
奇妙なことに、このアプリは問題なく動作していました (.bat ファイルと組み合わせて使用し、それを呼び出して、更新された構成ファイルをサーバーに展開しました)。しかし、ここ数週間で、このコンソール アプリの動作が徐々に低下しているように見えることに気付きました。更新スクリプトを正常に実行するには、このコンソール アプリケーションのソリューションを開いて F5 キーを押し、.bat を実行する必要があります。脚本。
sysinternals の ProcessMonitor を使用して、ファイルの読み取り/書き込みが行われていることを確認しました。指定したファイル パスにファイルが書き込まれていると表示されますが、ディレクトリを参照すると、ファイルが存在しないか、更新されていない。
Bootcamp経由でWindows 7 Ultimateを実行しているMac MiniでVS2010を使用しています。
TL;DR; コンソール アプリはデバッグ時に適切に動作し、ファイルを適切に更新しますが、デバッグなしで実行したり、bin/Release などからスタンドアロンまたは公開された .exe として実行した場合はそうではありません。
var devConfig = XDocument.Load(DevConfigPath, LoadOptions.None);
var prodConfig = XDocument.Load(ProductionConfigPath, LoadOptions.None);
var devMethods = devConfig.Descendants("deliveryMethods");
prodConfig.Root.Element("Heg.EA.Delivery").Element("deliveryMethods").ReplaceWith(devMethods);
try
{
Console.WriteLine(String.Format("Dev First Node:{0}", devConfig.Root.Element("ClientDeliveryTest").Element("deliveryMethods").FirstNode.ToString())); // Test Node to ensure file is being read correctly (it is).
Console.WriteLine(String.Format("Production First Node:{0}", prodConfig.Root.Element("Heg.EA.Delivery").Element("deliveryMethods").FirstNode.ToString())); // Test Node to ensure production configuration is updated correctly (it is).
Console.WriteLine("Saving...");
prodConfig.Save(@"C:\ProductionConfig.config"); // FAIL.
prodConfig.Save(@"ProductionConfig.config"); // FAIL.
prodConfig.Save(ProductionConfigPath); // FAIL.
Console.Write("File Saved.");
}
catch (Exception ex) // No exception is ever thrown.
{
Console.Write(String.Format("Error Saving: {0}", ex));
}