为什么“mscorlib.dll中发生”System.IO.IOException“types的未处理的exception(由某个.exelocking)”发生?

附加信息:进程无法访问文件“E:\ Data.xls”,因为正在被另一个进程使用。

在c#中我是一个漂亮的菜鸟,试图将一些数据保存到一个.xls文件中,该文件将五个图像帧中的数据一个接一个地收集起来,然后保存到一个.xls文件中。 但是我一直在跑

mscorlib.dll中发生未处理的types为“System.IO.IOException”的exception其他信息:进程无法访问文件“E:\ Data.xls”,因为它正在被另一个进程使用。

我在SO上发现了很多这样的问题,但无法解决问题。 这是我的代码:

string path = @"E:\Data.xls"; if (!File.Exists(path)) { File.Create(path); File.Create(path).Dispose(); } StringBuilder sb = new StringBuilder(); sb.AppendLine(x + "\t" + y + "\t" + pixel1.R + "\t" + pixel1.G + "\t" + pixel1.B); sb.AppendLine(x+1 + "\t" + y + "\t" + pixel2.R + "\t" + pixel2.G + "\t" + pixel2.B); sb.AppendLine(x + "\t" + Convert.ToInt32(y+1) + "\t" + pixel3.R + "\t" + pixel3.G + "\t" + pixel3.B); sb.AppendLine(x+1 + "\t" +Convert.ToInt32(y+1) + "\t" + pixel4.R + "\t" + pixel4.G + "\t" + pixel4.B); sb.AppendLine(x-1 + "\t" +Convert.ToInt32(y) + "\t" + pixel5.R + "\t" + pixel5.G + "\t" + pixel5.B); sb.AppendLine(x + "\t" + Convert.ToInt32(y - 1) + "\t" + pixel6.R + "\t" + pixel6.G + "\t" + pixel6.B); sb.AppendLine(x-1 + "\t" +Convert.ToInt32(y-1) + "\t" + pixel7.R + "\t" + pixel7.G + "\t" + pixel7.B); sb.AppendLine(x-1 + "\t" + Convert.ToInt32(y+1) + "\t" + pixel8.R + "\t" + pixel8.G + "\t" + pixel8.B); sb.AppendLine(x+1 + "\t" + Convert.ToInt32(y-1) + "\t" + pixel9.R + "\t" + pixel9.G + "\t" + pixel9.B); sb.AppendLine(x+2 + "\t" + y + "\t" + pixel10.R + "\t" + pixel10.G + "\t" + pixel10.B); sb.AppendLine(x + "\t" + Convert.ToInt32(y+2) + "\t" + pixel11.R + "\t" + pixel11.G + "\t" + pixel11.B); sb.AppendLine(x+2 + "\t" + Convert.ToInt32(y+2) + "\t" + pixel12.R + "\t" + pixel12.G + "\t" + pixel12.B); sb.AppendLine(x-2 + "\t" + y + "\t" + pixel13.R + "\t" + pixel13.G + "\t" + pixel13.B); sb.AppendLine(x + "\t" + Convert.ToInt32(y-2) + "\t" + pixel14.R + "\t" + pixel14.G + "\t" + pixel14.B); sb.AppendLine(x-2 + "\t" + Convert.ToInt32(y-2) + "\t" + pixel15.R + "\t" + pixel15.G + "\t" + pixel15.B); sb.AppendLine(x-2 + "\t" + Convert.ToInt32(y+2) + "\t" + pixel16.R + "\t" + pixel16.G + "\t" + pixel16.B); sb.AppendLine(x+2 + "\t" + Convert.ToInt32(y-2) + "\t" + pixel17.R + "\t" + pixel17.G + "\t" + pixel17.B); sb.AppendLine(x+2 + "\t" + Convert.ToInt32(y+1) + "\t" + pixel18.R + "\t" + pixel18.G + "\t" + pixel18.B); sb.AppendLine(x+1 + "\t" + Convert.ToInt32(y+2) + "\t" + pixel19.R + "\t" + pixel19.G + "\t" + pixel19.B); sb.AppendLine(x+2 + "\t" + Convert.ToInt32(y+2) + "\t" + pixel20.R + "\t" + pixel20.G + "\t" + pixel20.B); sb.AppendLine(x-2 + "\t" + Convert.ToInt32(y-1) + "\t" + pixel21.R + "\t" + pixel21.G + "\t" + pixel21.B); sb.AppendLine(x-1 + "\t" + Convert.ToInt32(y-2) + "\t" + pixel22.R + "\t" + pixel22.G + "\t" + pixel22.B); sb.AppendLine(x+2 + "\t" + Convert.ToInt32(y-1) + "\t" + pixel23.R + "\t" + pixel23.G + "\t" + pixel23.B); sb.AppendLine(x-1 + "\t" + Convert.ToInt32(y+2) + "\t" + pixel24.R + "\t" + pixel24.G + "\t" + pixel24.B); sb.AppendLine(x-2 + "\t" + Convert.ToInt32(y+1) + "\t" + pixel25.R + "\t" + pixel25.G + "\t" + pixel25.B); File.AppendAllText(path, sb.ToString()); sb.Clear(); 

此外,当我试图呈现一个像这样的webbrowser控件时,我得到另一个exception:

 webForm frm = new webForm(); frm.Show(); 

System.Windows.Forms.dll网页浏览器控件中出现未处理的types“System.Threading.ThreadStateException”exception

任何build议如何修复这些或我在这里做错了什么,将非常感激。

您正在打开文件两次,这是造成IOException

  if (!File.Exists(path)) { // REMOVE this line: File.Create(path); File.Create(path).Dispose(); } 

正如理查德,我在想这个

  if (!File.Exists(path)) { // REMOVE this line: File.Create(path); File.Create(path).Dispose(); } 

代码块导致错误。 所以这可能解决你的问题:

 if (!File.Exists(path)) { var file = File.Create(path); file.Dispose(); } 

File.Create创build文件,然后返回可用于写入文件的stream。 至。 只要这个stream生活文件被打开。

在你的代码中你有

 File.Create(path); File.Create(path).Dispose(); // snip File.WriteAllText(..); 

其中三次打开文件,但只closures一次。

更好的方法是使用using语句来pipe理stream的生命周期:

 using(var fileStream = File.Create(path)) // Using automatically closes the stream when it goes out of scope, the scope is defined by the accolades { // You can then use a stream writer to write to the file stream directly using(var streamWriter = new StreamWriter(fileStream)) { streamWriter.WriteLine(x + "\t" + y + "\t" + pixel1.R + "\t" + pixel1.G + "\t" + pixel1.B); // Etc.. } } 

如果文件已经存在,你可以做大致相同的事情

 if(File.Exist(path)) { using(var fileStream = File.OpenWrite(path)) { // same as before } } 

使用这种技术很less出错。 当然,如果另一个程序打开了这个文件, IOException仍然会发生。