程序说文件已在使用中,但我关闭了C#

时间:2018-11-02 02:33:42

标签: c# .net filestream

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:“该进程无法访问该文件,因为该文件正在被另一个进程使用” 我以为我已经通过打开文件后关闭文件来修复它,但是仍然出现错误。不知道什么是正确的解决方案。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

首先,无需创建一个空文件并打开它,而是使用适当的FileMode代替

FileMode.OpenOrCreate

  

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