我只是在这里回顾我的问题(尚未解决):
当我在调试模式下运行时没有发生异常,它只是在我从 exe 运行时才发生。
有人可以给它一个理由,为什么它在运行 exe 而不是在调试模式下给出异常。
我第一次运行 exe 时,它成功运行并为我提供了我需要的 xml 输出。但是对于观察者的第二个发现。它给了我这个例外:该进程无法访问该文件。
我只是在这里回顾我的问题(尚未解决):
当我在调试模式下运行时没有发生异常,它只是在我从 exe 运行时才发生。
有人可以给它一个理由,为什么它在运行 exe 而不是在调试模式下给出异常。
我第一次运行 exe 时,它成功运行并为我提供了我需要的 xml 输出。但是对于观察者的第二个发现。它给了我这个例外:该进程无法访问该文件。
我认为你的锁错了,因此多个线程试图获取你的文件
尝试执行以下操作:
if (Monitor.TryEnter(lockObject))
{
try{
//Your actual code
}
}
else
return;
我查看了完整的代码集……您遇到的问题与事件和时间有关。在保存文件的任何进程放开它之前,您的事件是从 FileWatcher 对象触发的。尝试将 Thread.Sleep 放在 Convert 方法的顶部...不需要太长,从 1 秒左右开始...看看会发生什么。
private static void convert(object source, FileSystemEventArgs f)
{
string FileName;
FileName = f.FullPath;
string FilePath;
FilePath = f.Name;
var watcher = source as FileSystemWatcher;
string destinationFile = @"D:/GS/" + FilePath;
Thread.Sleep(1000);
//...
您的EXE进程正在连续运行。您的 exe 进程可能应该停止。那么“进程无法访问文件”错误将永远不会出现。对您的代码使用适当的错误处理技术。您的代码与 XML 文件有持续的通信。所以,如果你尝试第二次访问,如果我没记错的话,访问错误就会到来。
这是正常工作的最终 convert() 。感谢所有在这里帮助过我的人。我非常感谢您为帮助我付出的时间和精力。我希望我能接受上述两种解决方案。但我把我的一票投给你们两个。再一次感谢你。
private static void convert(object source, FileSystemEventArgs f)
{
string FileName;
FileName = f.FullPath;
string FilePath;
FilePath = f.Name;
var watcher = source as FileSystemWatcher;
string destinationFile = @"D:/GS/" + FilePath;
System.Threading.Thread.Sleep(1000);
if (Monitor.TryEnter(lockObject)) **
{
try
{
watcher.EnableRaisingEvents = false;
XmlDocument xdoc = new XmlDocument();
try
{
xdoc.Load(FileName);
xdoc = null;
}
catch (XmlException xe)
{
xdoc = null;
using (StreamWriter w = File.AppendText(FileName))
{
Console.WriteLine(xe);
w.WriteLine("</title>");
w.WriteLine("</titleContent>");
Console.WriteLine("1st");
}
}
System.Threading.Thread.Sleep(2000);
XPathDocument myXPathDoc = new XPathDocument(new StreamReader(FileName, System.Text.Encoding.GetEncoding("windows-1256")));
XslCompiledTransform myXslTrans = new XslCompiledTransform();
myXslTrans.Load("D:/GS/xsl/test.xsl");
XmlTextWriter myWriter = new XmlTextWriter(destinationFile, null);
myWriter.Formatting = Formatting.Indented;
myWriter.Indentation = 4;
myXslTrans.Transform(myXPathDoc, null, myWriter);
myWriter.Close();
Console.WriteLine("2nd");
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.ToString());
}
finally
{
Monitor.Exit(lockObject);
watcher.EnableRaisingEvents = true;
Console.WriteLine("Finally");
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
}
}
}