我正在尝试加载所有"错误日志文件"到一个(希望不是巨大的)字符串,然后将该字符串分配给Multiline textBox:
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目录中有一个文件(名为&#34; ExceptionLog_2.11.2009.txt&#34;)和一些文本数据(当发生异常时以编程方式创建文件)。< / p>
那么为什么我在MessageBox.Show()中看到一个空字符串,而textBoxErrLogsContents中什么都没有?
几乎相同的代码适用于VS 2013&#34; Sandbox&#34; app,只有不同的目录名,文件类型和textBox名称:
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();
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();
}
答案 0 :(得分:3)
这没有任何意义:
const string errLogDir = "\\ErrorLog";
Directory.CreateDirectory(errLogDir);
StringBuilder sb = new StringBuilder();
DirectoryInfo di = new DirectoryInfo(errLogDir);
FileInfo[] files = di.GetFiles("*.txt");
所以你创建一个新目录,然后尝试从中读取文件。在这种情况下,您在根目录下创建目录(即“C:\ ErrorLog”,如果当前工作目录的驱动器是C :)。
如果您要求创建的目录已存在,CreateDirectory
只返回DirectoryInfo
对象。但是如果你创建一个新目录,然后尝试从中获取文件,很可能根本就没有文件,因为你刚创建了一个空目录。
你可能想要那个
const string errorLogDir = "ErrorLog";
这将导致将目录创建为当前工作目录的子目录。
顺便说一下,没有读物:
Directory.CreateDirectory(errLogDir);
DirectoryInfo di = new DirectoryInfo(errLogDir);
CreateDirectory
返回DirectoryInfo
个对象。所以你可以写:
DirectoryInfo di = new DirectoryInfo(errLogDir);
现在,EXE目录很可能与当前工作目录不同。如果您想从EXE的子目录中获取信息,那么您必须明确说出:
string fullName = Assembly.GetEntryAssembly().Location;
string exeDirectory = Path.GetDirectoryName(fullName);
string fullErrLogDir = Path.Combine(exeDirectory, errLogDir);
DirectoryInfo di = Directory.CreateDirectory(fullErrLogDir);
最后,您可以替换所有这些代码:
using (StreamReader sr = new StreamReader(fi.FullName))
{
String line;
while ((line = sr.ReadLine()) != null)
{
sb.AppendLine(line);
}
}
只有一行:
sb.AppendLine(File.ReadAllText(fi.FullName));
答案 1 :(得分:1)
首先,在所有情况下调用CreateDirectory
都是个坏主意。这令人困惑。相反,检查目录是否存在,如果不存在,则创建它并退出该函数(因为如果你创建它,你就知道没有数据)。这样可以更快地发现你的错误,也可以防止@Jim Mischel(和其他人的)混淆。
您的代码问题实际上源于您的一条评论。你说从你的电脑用WMDC看到的文件是Computer\WindowsCE\Program Files\HHS\ErrorLog
。设备本身等同于\Program Files\HHS\ErrorLog
而不是仅\ErrorLog
。请记住,Windows CE设备上没有相对路径。