文件正在使用错误C#正在从用户指定的文件读取文本

文件正在使用错误C#正在从用户指定的文件读取文本,c#,stream,runtime-error,C#,Stream,Runtime Error,我的代码给出了一个运行时错误,该文件已在使用中。我不确定我是如何解决这个问题的。我需要文件对话框与用户交互,但我想逐行阅读。该文件以分号分隔,我手动解析并将其输入系统。如何从opendialog中释放文件以便使用它。任何帮助,我们都将不胜感激 List<string> datalinestream = new List<string>(); FileDialog FD = new System.Windows.Forms.OpenFileDialog(); if (FD

我的代码给出了一个运行时错误,该文件已在使用中。我不确定我是如何解决这个问题的。我需要文件对话框与用户交互,但我想逐行阅读。该文件以分号分隔,我手动解析并将其输入系统。如何从opendialog中释放文件以便使用它。任何帮助,我们都将不胜感激

List<string> datalinestream = new List<string>();
FileDialog FD = new System.Windows.Forms.OpenFileDialog();

if (FD.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{


    TextReader reader = new StreamReader(FD.FileName);
    using (reader)
    {
        string line = "";
        while ((line = reader.ReadLine()) != null)
        {

            while (!string.Equals(reader.Read(),"/r"))
            {
                datalinestream.Add(GetWord(reader));
            }
            LuceneDB.AddUpdateLuceneIndex(new MATS_Doc( datalinestream));
            datalinestream.Clear();
        }


    }
}
List datalinestream=new List();
FileDialog FD=new System.Windows.Forms.OpenFileDialog();
if(FD.ShowDialog()==System.Windows.Forms.DialogResult.OK)
{
TextReader=新的StreamReader(FD.FileName);
使用(读卡器)
{
字符串行=”;
而((line=reader.ReadLine())!=null)
{
而(!string.Equals(reader.Read(),“/r”))
{
Add(GetWord(reader));
}
LuceneDB.AddUpdateLuceneIndex(新MATS_文档(datalinestream));
datalinestream.Clear();
}
}
}

我要做的是创建一个临时文件,其中包含与原始文本文件相同的信息。我将确保使用类似GUID的格式格式化文件名,这样就不会再次引起任何问题。然后,我的代码将完成临时文件的所有工作

之后,(如果需要)使用对临时文件所做的更改更新原始文件


处理文件有时是一件令人头痛的事情,但解决办法或欺骗系统可以完成这项工作。

我建议将
FileOpenDialog
交互与解析分离开来

大概是这样的:

List<string> datalinestream = new List<string>();
string fileName;

using(FileDialog FD = new System.Windows.Forms.OpenFileDialog())
{
    if(FD.ShowDialog() == DialogResult.OK)
        fileName = FD.FileName;
    else
        return;
}

TextReader reader = new StreamReader(fileName);
using (reader)
{
    string line = "";
    while ((line = reader.ReadLine()) != null)
    {

        while (reader.Read() != '\r')
        {
            datalinestream.Add(GetWord(reader));
        }
        LuceneDB.AddUpdateLuceneIndex(new MATS_Doc( datalinestream));
        datalinestream.Clear();
    }
}
List datalinestream=new List();
字符串文件名;
使用(FileDialog FD=new System.Windows.Forms.OpenFileDialog())
{
如果(FD.ShowDialog()==DialogResult.OK)
fileName=FD.fileName;
其他的
返回;
}
TextReader=新的StreamReader(文件名);
使用(读卡器)
{
字符串行=”;
而((line=reader.ReadLine())!=null)
{
while(reader.Read()!='\r')
{
Add(GetWord(reader));
}
LuceneDB.AddUpdateLuceneIndex(新MATS_文档(datalinestream));
datalinestream.Clear();
}
}

我还假设您希望检查
\r
字符,而不是带有两个字符
/
r
的字符串,因为
StreamReader.Read()
返回一个字符,否则您的内部循环将不得不进行非常剧烈的更改。

您需要使用
块->
更改
(TextReader=newstreamreader(FD.FileName){…}
@IAbstract:这本质上是一回事。两者完全相同valid@BryanJ.Ross:本质上是相同的,两者都将编译,
reader
可以处理…但是
reader
仍然在范围内,可以很容易地调用,或者更糟糕的是,通过一系列方法传递,这使得查找bug变得很困难。除在
处,reader
将进行处置。
处置
在构造函数抛出时是不必要的,下一行是
使用
。但这不是OP错误的来源。除非有更多他没有发布的内容。还有更多内容。我打开了我正在阅读的文件。它在文本编辑器中被最小化,所以我看不到它因此,我打电话给你。谢谢你的及时回复!问题出在我这边,但投票了,因为你努力尝试修复,你的代码更整洁了。allready有一个失败的用户对话框的陷阱。这就是为什么我是代码新手。谢谢!!!问题出在我这边,但投票了,因为你努力尝试修复,你的代码有点neater allready捕获了一个失败的用户对话框。这就是为什么我是代码新手。谢谢!!!–