为什么我没有使用此代码从我的文件中获取文本
本文关键字:我的 文件 取文本 获取 代码 为什么 | 更新日期: 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 设备上没有相对路径。