C#StreamReader会阻止进程,即使我关闭了

C#StreamReader会阻止进程,即使我关闭了,c#,file-io,streamreader,C#,File Io,Streamreader,我目前收到以下错误: Error 18 Could not copy "obj\Debug\SoldierApp.exe" to "bin\Debug\SoldierApp.exe". Exceeded retry count of 10. Failed. Error 19 Unable to copy file "obj\Debug\SoldierApp.exe" to "bin\Debug\SoldierApp.exe". The process cannot access t

我目前收到以下错误:

Error   18  Could not copy "obj\Debug\SoldierApp.exe" to "bin\Debug\SoldierApp.exe". Exceeded retry count of 10. Failed.

Error   19  Unable to copy file "obj\Debug\SoldierApp.exe" to "bin\Debug\SoldierApp.exe". The process cannot access the file 'bin\Debug\SoldierApp.exe' because it is being used by another process.
所以我猜我的
StreamReader
在某个地方没有正确关闭。虽然我知道我已经关了。这是我的密码

 public Form1()
    {
        InitializeComponent();
        if(File.Exists("soldier.csv"))
        {
            sr = new StreamReader("soldier.csv");
            string stream_line;
            int intCommaIndex1 = 0;
            int intCommaIndex2;
            string strSubStringSect;
            stream_line = sr.ReadLine();
            while(stream_line != EOF) //EOF is a constant
            {
                intCommaIndex1 = stream_line.IndexOf(",", intCommaIndex1);
                intCommaIndex2 = stream_line.IndexOf(",", intCommaIndex1);
                strSubStringSect = stream_line.Substring(intCommaIndex1, intCommaIndex2);
                richTextBox1.Text = richTextBox1.Text + " " + strSubStringSect;
                intCommaIndex1 = intCommaIndex2;
                stream_line = sr.ReadLine();
            }
            sr.Close(); //closed here!
        }

    }

对于
C
文件IO来说是相当新的,在我看来似乎一切都正常?关于我为什么会出现这些错误,有什么建议吗?

我多次遇到这个问题,它说“进程无法访问文件‘bin\Debug\Some.exe’,因为它正被另一个进程使用。”

通常,您应该清理解决方案,然后重新构建它,这样就可以解决问题

Build -> Clean Solution
然后


如果这不能解决问题。然后,您应该手动从bin文件夹中删除
Soldier.exe
,然后重新构建解决方案

我多次遇到这个问题,它说“进程无法访问文件'bin\Debug\Some.exe',因为它正被另一个进程使用。”

通常,您应该清理解决方案,然后重新构建它,这样就可以解决问题

Build -> Clean Solution
然后


如果这不能解决问题。然后,您应该手动从bin文件夹中删除
Soldier.exe
,然后再次构建解决方案

首先,我建议使用。这样,即使最终出现异常,也会关闭文件(并释放读取器)。 另一件事是,如果ReadLine到达流的末尾,它将返回null。 但是StreamReader中有一个有用的属性:EndOfStream。当你到达溪流的尽头时,这是真的

因此,我建议使用如下代码:

public Form1()
{
    if(File.Exists("soldier.csv"))
    {
        InitializeComponent();
        using (StreamReader sr = new StreamReader("soldier.csv"))
        {
            string stream_line;
            int intCommaIndex1 = 0;
            int intCommaIndex2;
            string strSubStringSect;
            while (!sr.EndOfStream)
            {
                stream_line = sr.ReadLine();
                intCommaIndex1 = stream_line.IndexOf(",", intCommaIndex1);
                intCommaIndex2 = stream_line.IndexOf(",", intCommaIndex1);
                strSubStringSect = stream_line.Substring(intCommaIndex1, intCommaIndex2);
                richTextBox1.Text = richTextBox1.Text + " " + strSubStringSect;
                intCommaIndex1 = intCommaIndex2;
            }
        }
    }

}

首先,我建议使用。这样,即使最终出现异常,也会关闭文件(并释放读取器)。 另一件事是,如果ReadLine到达流的末尾,它将返回null。 但是StreamReader中有一个有用的属性:EndOfStream。当你到达溪流的尽头时,这是真的

因此,我建议使用如下代码:

public Form1()
{
    if(File.Exists("soldier.csv"))
    {
        InitializeComponent();
        using (StreamReader sr = new StreamReader("soldier.csv"))
        {
            string stream_line;
            int intCommaIndex1 = 0;
            int intCommaIndex2;
            string strSubStringSect;
            while (!sr.EndOfStream)
            {
                stream_line = sr.ReadLine();
                intCommaIndex1 = stream_line.IndexOf(",", intCommaIndex1);
                intCommaIndex2 = stream_line.IndexOf(",", intCommaIndex1);
                strSubStringSect = stream_line.Substring(intCommaIndex1, intCommaIndex2);
                richTextBox1.Text = richTextBox1.Text + " " + strSubStringSect;
                intCommaIndex1 = intCommaIndex2;
            }
        }
    }

}

由于“托管进程”,在VisualStudio上调试时经常发生这种情况。正在运行的进程上是否有vshost.exe

关闭Visual Studio,重新打开解决方案,然后尝试以下操作:

  • 在“项目”菜单上,单击“属性”
  • 单击调试选项卡
  • 清除“启用Visual Studio宿主进程”复选框

  • 如果vshost.exe仍保留您的文件,这可能会解决您的问题。

    在Visual Studio上调试时,由于“托管进程”,经常会发生这种情况。正在运行的进程上是否有vshost.exe

    关闭Visual Studio,重新打开解决方案,然后尝试以下操作:

  • 在“项目”菜单上,单击“属性”
  • 单击调试选项卡
  • 清除“启用Visual Studio宿主进程”复选框

  • 如果vshost.exe仍保留您的文件,这可能会解决您的问题。

    首先,您应该使用
    using
    语句,而不是手动调用
    Close()
    。否则,如果抛出异常,您将不会调用
    Close
    。而且,它看起来像是一个实例变量——你最好把它变成一个局部变量,几乎可以肯定……哦,但是它不能复制的文件不是你正在读取的文件。我怀疑你仍然有一个应用程序实例在运行,这就是为什么你不能构建一个需要复制到同一位置的更新版本。我没有实例。那是我的问题。我不能使用使用,因为我们的教授没有教过,我知道这真的很荒谬,因为这不是我们在现实世界中最好的案例方法。这就是让我感到厌烦的地方。我读过c#msdn或其他什么,但我需要使用
    Close
    ,但我会尝试关闭计算机并重新启动。我确实意外地从while
    EOF
    中得到了一个无限循环,并且没有重新打印
    流行
    read如果您不能使用
    使用
    ,那么将所有内容包装在一个
    try catch
    中,并在
    finally
    块中调用
    Close
    。“我没有实例”-好的,检查任务管理器。但问题不在于StreamReader,因为它不是同一个文件……首先,您应该使用
    using
    语句,而不是手动调用
    Close()
    。否则,如果抛出异常,您将不会调用
    Close
    。而且,它看起来像是一个实例变量——你最好把它变成一个局部变量,几乎可以肯定……哦,但是它不能复制的文件不是你正在读取的文件。我怀疑你仍然有一个应用程序实例在运行,这就是为什么你不能构建一个需要复制到同一位置的更新版本。我没有实例。那是我的问题。我不能使用使用,因为我们的教授没有教过,我知道这真的很荒谬,因为这不是我们在现实世界中最好的案例方法。这就是让我感到厌烦的地方。我读过c#msdn或其他什么,但我需要使用
    Close
    ,但我会尝试关闭计算机并重新启动。我确实意外地从while
    EOF
    中得到了一个无限循环,并且没有重新打印
    流行
    read如果您不能使用
    使用
    ,那么将所有内容包装在一个
    try catch
    中,并在
    finally
    块中调用
    Close
    。“我没有实例”-好的,检查任务管理器。但问题不在于StreamReader,因为它不是同一个文件……是的,我已经清理和重建了大约10次。下一步我可能会删除exe。我所做的只是重新启动我的计算机,一定有一个应用程序打开了,但没有显示,因为我在意识到它并启动它之前在while循环中犯了错误。那一定是我的错误。是的,我已经清理和重建了大约10次了。下一步我可能会删除exe,但只要重新启动我的电脑,肯定有ap