C# C文件。读取错误:文件已被其他进程使用

C# C文件。读取错误:文件已被其他进程使用,c#,file,streamreader,C#,File,Streamreader,我正试图解析几个文件,在这样做时,有一些值需要忽略,等等。我目前使用以下代码执行此操作: double[][] rows = File .ReadLines(filepath) .Select(line => line .Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries) .Where(item => !stri

我正试图解析几个文件,在这样做时,有一些值需要忽略,等等。我目前使用以下代码执行此操作:

double[][] rows = File  
         .ReadLines(filepath)  
         .Select(line => line
            .Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)  
            .Where(item => !string.Equals("NAN", item, StringComparison.OrdinalIgnoreCase)))   
         .Where(items => items.Any())
         .Select(items => items
           .Select(item => double.Parse(item, CultureInfo.InvariantCulture))  
           .ToArray())
         .ToArray();
但我最近犯了一个错误。在网上搜索后,我发现

 using (FileStream stream = File.Open("path to file", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        {
            using (StreamReader reader = new StreamReader(stream))
            {
                while (!reader.EndOfStream)
                { DO SOMETHING}
            }
        }
将解决此问题。但是,我无法根据自己的需要更改代码。当我尝试时:

      using (FileStream stream = File.Open("path to file", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        {
            using (StreamReader reader = new StreamReader(stream))
            {
                while (!reader.EndOfStream)
                {
                    reader.ReadLine().Select(line => line
            .Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)  
            .Where(item => !string.Equals("NAN", item, StringComparison.OrdinalIgnoreCase)))   
         .Where(items => items.Any())
         .Select(items => items
           .Select(item => double.Parse(item, CultureInfo.InvariantCulture))   
           .ToArray())
         .ToArray();
                }
            }
        }
它在.Split上给了我一个错误,因为它不是StreamReader的已知定义。。。我知道这是一个非常愚蠢的问题,而且很容易解决,但我无法做到这一点

提前谢谢

关于

您需要将reader.ReadLine替换为reader.ReadToEnd.Splitnew string[]{Environment.NewLine},StringSplitOptions.None。您还可以为reader类编写自己的扩展方法ReadLines。

reader.ReadLine将返回一个字符串。所以当你这样做的时候,选择这个,你就是在把它投射到一个IEnumerable中。您不能这样做。在字符上拆分

您需要通过一次读取一行代码来重新格式化代码

所以有些东西是这样的:

reader.ReadLine()
      .Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
      .Where(item => !string.Equals("NAN", item, StringComparison.OrdinalIgnoreCase))
      .Where(items => items.Any())
      .Select(items => items.Select(item => double.Parse(item.ToString())).ToArray()).ToArray();
更新

为了回答您的评论,我很可能会将数据结构从double[]]更改为List

如果您想保留双[][],可以这样做

流式传输文件时,您可以更改要添加到列表中的代码:

List<double[]> example = new List<double[]>();

while (!reader.EndOfStream)
{
    example.Add(reader.ReadLine()
      .Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
      .Where(item => !string.Equals("NAN", item, StringComparison.OrdinalIgnoreCase))
      .Where(items => items.Any())
      .Select(item => double.Parse(item.ToString(), CultureInfo.InvariantCulture)).ToArray());
}


var returnvalue = example.ToArray();


在进行这样的更改时,请确保结果与原始代码匹配

是否有必要使用外部使用?试试这个:

    try
    {
        using (var reader = new StreamReader(filename))
        {
            while (!reader.EndOfStream)
            {
                { your split implementation }
            }
        }
    }

    // now you dont need to close a stream because
    // using statement will handle it for you

    catch // appropriate exception handling
    {

    }

StreamReader没有ReadLines方法。除了StreamReader.ReadLines不存在这一事实之外,如果您打算将某些内容全部加载到内存中,那么流式处理有什么意义呢?我编写了ReadLines的内联实现示例,建议将其作为扩展方法编写。您可以更清楚地回答,OP可能无法将其作为扩展方法写入。ReadLine将为您提供一个字符串,如果您写入。Select,您基本上是在其中迭代每个字符,因此不能将拆分作为字符的扩展方法。尝试使用ReadAllLines或ReadLines读取所有行,尝试将其放入字符串数组中,然后可以使用。在代码中选择以形成筛选;例如:File.ReadAllLinespath或File.readlinespath替换此代码是不明智的,它将以完全相同的方式失败。您必须找出打开此文件的其他代码或进程。如果您不知道,请使用SysInternals的Handle实用程序。谢谢您的时间!我理解你解释得很好的问题!谢谢,最后一个问题,在我将所有信息存储到数组double[][]行之前,该行正好包含数据所需的列/行数量。您提供的代码是如何实现这一点的?我不明白那部分=/谢谢你的时间还在学习谢谢,是的,我同意你的意见,我会检查一下。然而,我有7个函数,它们都是用其他参数和其他文件来做类似的事情。基本上,要改变列表的所有结构都需要大量的工作。有没有办法用双[]完成同样的事情?如果不是的话,我就接受它并修改我的代码,因为我很确定你的解决方案工作得很好!感谢againI更新了答案,尽管您可能希望将返回对象更改为类似IEnumerable的内容。通过这种方式,您可以更改所使用的内部数据结构,只要它实现IEnumerableSorry必须已错误地删除它-它应该返回到我删除它的位置。我已更新了代码,double-select语句不是必需的,它的作用与原始版本相同,将字符串1.2投影到IEnumerable“1”、“1”、“2”中。我已经用输入1测试了上面的代码;1.1.2;这是真的,但无助于解决我的问题。我无法向新读者实现我想要的所有拆分信息。基本上,我所要做的就是使用StreamReader将代码从旧的code File.ReadLines传输到新的,但不知何故我无法完成=/