我有2个文本文件,test1.txt
和test2.txt
。 test2.txt
实际上是test1.txt
的副本。
我想编写一些允许textbox
从任一文本文件中读取值的代码,这样如果其中一个文本文件为空,它就可以从另一个文本文件中读取值和副本反之亦然。
我首先通过手动清空test1.txt
的内容来测试我的代码,然后清空test2.txt
的内容,这些内容完美无缺,因为textbox
上总会出现一个值。但是,当两个文本文件同时包含内容时,每当我尝试执行它时都会抛出NullReferenceException
。
如果我问,请不要介意,因为我可能听起来很愚蠢,但是因为这两个文件都不是空的,这就是为什么抛出这个异常的原因?关于NullReferenceException
,我已阅读此post,但我不明白我的错误属于哪个类别。
这是文本文件的示例:
^ Michael Johnson^ ^ michaelj^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ michaeljohnson@example.com^ ^ 123456^ ^ ^ 123456^ ^ ^ ^ ^ ^ ^
这是我的代码:
using System.IO;
Log = @"C:\logs\submission\test1.txt";
Log2 = @"C:\logs\submission\test2.txt";
if (!File.Exists(Log))
{
File.Create(Log).Dispose();
}
if (!File.Exists(Log2))
{
File.Create(Log2).Dispose();
}
FileStream fs1 = new FileStream(Log, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
FileStream fs2 = new FileStream(Log2, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
var sr1 = new StreamReader(fs1);
var sr2 = new StreamReader(fs2);
while (!sr1.EndOfStream || !sr2.EndOfStream)
{
if (new FileInfo(Log).Length != 0)
{
var line1 = sr1.ReadLine();
var values1 = line1.Split('^');
if (values1[3].ToString().Trim() == User.Identity.Name.)
{
number = values1[18].ToString().Trim();
}
if (!(values1[3].ToString().Trim().Contains(User.Identity.Name)))
{
unregisteredUser = User.Identity.Name;
}
}
else
{
if (new FileInfo(Log2).Length != 0)
{
var line2 = sr2.ReadLine();
var values2 = line2.Split('^');
if (values2[3].ToString().Trim() == User.Identity.Name)
{
number = values2[18].ToString().Trim();
}
if (!(values2[3].ToString().Trim().Contains(User.Identity.Name)))
{
unregisteredUser = User.Identity.Name;
}
}
}
}
sr1.Close();
sr2.Close();
fs1.Close();
fs2.Close();
这是抛出异常的确切位置:
var values1 = line1.Split('^');
答案 0 :(得分:0)
如果两个文件都包含以下内容: if(new FileInfo(Log).Length!= 0)和这个 if(new FileInfo(Log2).Length!= 0)
是真的。 如果一个文件流结束,但另一个仍然有东西要读 这将导致在到达流上的Readline,因此不会返回字符串,但为null。 之后,您尝试在此现有值上访问Split,这会使您的程序最终失败。
答案 1 :(得分:-1)
所以你想从具有给定用户名的两个文件中提取数字值?
我使用这个更易读的LINQ查询:
var numbers = File.ReadLines(Log).Concat(File.ReadLines(Log2))
.Select(l => l.Split('^'))
.Where(fields => fields.Length >= 19
&& fields[3].Trim().Equals(User.Identity.Name, StringComparison.InvariantCultureIgnoreCase))
.Select(fields => fields[18].Trim());
string number = numbers.FirstOrDefault();
string unregisteredUser = number == null ? User.Identity.Name : null;