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

本文关键字:我的 文件 取文本 获取 代码 为什么 | 更新日期: 2023-09-27 18:31:51

我正在尝试将所有"错误日志文件"加载到一个(希望不是巨大的)字符串中,然后将该字符串分配给多行文本框:

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() 中看到一个空字符串,而在 textBoxErrLogsContent 中没有任何内容呢?

更新

几乎相同的代码在VS 2013"沙盒"应用程序中工作,只是目录名称,文件类型和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();
}

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

这没有任何意义:

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));

首先,在所有情况下调用CreateDirectory都是一个坏主意。 这令人困惑。 相反,请检查目录是否存在,如果不存在,则创建它并退出函数(因为如果您创建了它,您就知道没有数据)。 这会更快地发现你的错误,也可以防止@Jim米歇尔(和其他人)的困惑。

你的

代码的问题实际上植根于你的一个注释。您说该文件,从带有WMDC的PC上看到,处于Computer'WindowsCE'Program Files'HHS'ErrorLog。在设备本身上,这相当于'Program Files'HHS'ErrorLog不仅仅是'ErrorLog .请记住,Windows CE 设备上没有相对路径。