C# File.Read Error: File already in Use by other process

C# File.Read Error: File already in Use by other process

我正在尝试解析多个文件,这样做时有一些值需要忽略等等。我目前是用这个代码做的:

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().Split(new string[] { Environment.NewLine }, StringSplitOptions.None)。您也可以为 reader class.

编写自己的扩展方法 ReadLines

Reader.ReadLine() 将 return 一个字符串。因此,当您对此执行 .Select 时,您会将其投影到 IEnumerable<char> 中。然后您不能对字符执行 .Split

您需要重新格式化您的代码,一次阅读一行

所以这行:

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>>

如果你想保留 double[][] 你可以这样做。

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

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

备注

进行此类更改时,请确保结果与原始代码相匹配。

是否需要使用外部"using"?试试这个:

    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
    {

    }