private void buttonAdd_Click(object sender, EventArgs e)
{
string path = @"comics.txt";
if (!File.Exists(path))
{
var myComicsFile = File.Create(path);
myComicsFile.Close();
FileStream file = new FileStream("comics.txt", FileMode.Open, FileAccess.ReadWrite);
TextWriter write = new StreamWriter(path);
}
else if (File.Exists(path))
{
FileStream file = new FileStream("comics.txt", FileMode.Open, FileAccess.ReadWrite);
TextWriter write = new StreamWriter(path);
}
}
我不断收到错误System.IO.IOException:“该进程无法访问该文件,因为该文件正在被另一个进程使用” 我以为我已经通过打开文件后关闭文件来修复它,但是仍然出现错误。不知道什么是正确的解决方案。任何帮助将不胜感激。
答案 0 :(得分:3)
首先,无需创建一个空文件并打开它,而是使用适当的FileMode
代替
OpenOrCreate
指定操作系统应该打开一个文件(如果存在); 否则,应创建一个新文件。如果文件用 FileAccess.Read,需要读取权限。如果文件访问是 FileAccess.Write,需要写入权限。如果文件已打开 使用FileAccess.ReadWrite时,读取和写入权限都是 必填。
使用BCL方法时,请始终检查文档以获取有关如何使用它的线索,特别是寻找某物是否支持IDisposable
(如果确实支持)的话,请始终使用using
语句< / p>
using Statement (C# Reference)
提供了一种方便的语法,可确保正确使用 可分配对象。
简而言之,您可以做到这一点
using (var file = new FileStream("comics.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite)
using(var TextWriter write = new StreamWriter(file))
{
// stuff here
}
基本上,当using
使用带有流派生的using语句时,它将关闭并处置任何非托管资源,例如文件句柄。您的情况是,文件句柄悬空了,因此出现了问题
答案 1 :(得分:1)
使用“ using”语句来确保文件已关闭。
参考: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement
答案 2 :(得分:0)
您可以嵌套using
,通过自动调用dispose
消除许多潜在的问题(就像您已经遇到的问题)。例如
using (FileStream fs = new FileStream("c:\file.txt", FileMode.Open))
{
using (BufferedStream bs = new BufferedStream(fs))
{
using (System.IO.StreamReader sr = new StreamReader(bs))
{
string output = sr.ReadToEnd();
}
}
}