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
{
}
我正在尝试解析多个文件,这样做时有一些值需要忽略等等。我目前是用这个代码做的:
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
{
}