为什么我没有使用此代码从我的文件中获取文本?

时间:2014-11-24 23:14:57

标签: c# windows-ce streamreader fileinfo directoryinfo

我正在尝试加载所有"错误日志文件"到一个(希望不是巨大的)字符串,然后将该字符串分配给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();

更新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();
}

2 个答案:

答案 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设备上没有相对路径。