【发布时间】:2014-11-24 23:14:56
【问题描述】:
我正在尝试将我所有的“错误日志文件”加载到一个(希望不是巨大的)字符串中,然后将该字符串分配给多行文本框:
private void PopulateTextBox()
{
const string errLogDir = "\\ErrorLog";
Directory.CreateDirectory(errLogDir);
StringBuilder sb = new StringBuilder();
DirectoryInfo di = new DirectoryInfo(errLogDir);
FileInfo[] files = di.GetFiles("*.txt");
foreach (FileInfo fi in files)
{
sb.AppendLine(String.Format("*** {0} ***", fi.FullName));
using (StreamReader sr = new StreamReader(fi.FullName))
{
String line;
while ((line = sr.ReadLine()) != null)
{
sb.AppendLine(line);
}
}
sb.AppendLine(String.Empty);
}
string errLogContents = sb.ToString();
MessageBox.Show(String.Format("errLogContents is {0}", errLogContents));
textBoxErrLogsContents.Text = sb.ToString();
}
在 .exe 目录正下方的 \ErrorLog 目录中有一个文件(名为“ExceptionLog_2.11.2009.txt”),其中包含一些文本数据(文件是在发生异常时以编程方式创建的)。
那么为什么我在 MessageBox.Show() 中看到一个空字符串,而 textBoxErrLogsContents 中没有任何内容?
更新
几乎相同的代码在 VS 2013“沙盒”应用程序中工作,只是目录名称、文件类型和文本框名称不同:
const string errLogDir = @"C:\MiscInWindows7";
Directory.CreateDirectory(errLogDir);
StringBuilder sb = new StringBuilder();
DirectoryInfo di = new DirectoryInfo(errLogDir);
FileInfo[] files = di.GetFiles("*.xml");
foreach (FileInfo fi in files)
{
sb.AppendLine(String.Format("*** {0} ***", fi.FullName));
using (StreamReader sr = new StreamReader(fi.FullName))
{
String line;
while ((line = sr.ReadLine()) != null)
{
sb.AppendLine(line);
}
}
sb.AppendLine(String.Empty);
}
string errLogContents = sb.ToString();
MessageBox.Show(String.Format("errLogContents is {0}", errLogContents));
textBox7.Text = sb.ToString();
更新 2
ctacke 重击了 noggin 上的尖峰:我没有提供完整的路径。这有效:
private void PopulateTextBox()
{
String logDirPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
String fullPath = logDirPath + "\\ErrorLog";
StringBuilder sb = new StringBuilder();
DirectoryInfo di;
if (!Directory.Exists(fullPath))
{
di = Directory.CreateDirectory(fullPath);
}
else
{
di = new DirectoryInfo(fullPath);
}
FileInfo[] files = di.GetFiles("*.err");
foreach (FileInfo fi in files)
{
sb.AppendLine(String.Format("*** {0} ***", fi.FullName));
using (StreamReader sr = new StreamReader(fi.FullName))
{
String line;
while ((line = sr.ReadLine()) != null)
{
sb.AppendLine(line);
}
}
sb.AppendLine(String.Empty);
}
textBoxErrLogsContents.Text = sb.ToString();
}
【问题讨论】:
-
为什么投反对票?我犯了明显的错误吗?如果是这样,是什么?无声的投票没有帮助,而且还有些懦弱。
-
目标文件中是否有换行符?一种情况是
ReadLine不返回任何内容,因为目标文件中没有新行。我也不喜欢 while 逻辑,因为它不是超级可读的。将其分成两条明显的行,其中line = sr.Readline()和while条件。聪明你一无所获,清晰则一无所获。 -
另外,文本格式是什么(ASCII 或 Unicode)?这也可能对行为产生影响。
-
您可以将整个
StreamReader和while循环替换为:sb.AppendLine(File.ReadAllText(fi.FullName)) -
在另一条评论中,您说该文件位于“Computer\WindowsCE\Program Files\HHS\ErrorLog”。在将是
\Program Files\HHS\ErrorLog不 只是\ErrorLog的设备上。这大概就是问题的根源吧。请记住,设备上没有相对路径。
标签: c# windows-ce streamreader fileinfo directoryinfo