从不同位置的多个类型文件中读取
Read in from multiple type files all in different locations
在使用 StreamReader 的 C# 中,我必须从多个文件中提取数据。这是我到目前为止的代码。它并不完全正确,我必须对其进行更具体的说明并添加更多内容。我需要 select 各种基于共同日期和时间的个人文件。因此,只有具有共同输入日期和时间的文件才会被 select 提取。问题是文件是不同类型的,例如文本、xml 和 html,它们可能位于不同的位置。我必须一起显示所有提取的数据。任何帮助将不胜感激。谢谢。
private void btnLoad_Click(object sender, RoutedEventArgs e)
{
try
{
var files = Directory.EnumerateFiles("D:\path", "*.*", SearchOption.AllDirectories)
.Where(s => s.EndsWith(".txt") || s.EndsWith(".xml"));
using (StreamReader sr = new StreamReader("files")).
{
string line;
while ((line = sr.ReadLine()) != null)
{
lbDisplay.Items.Add(line);
}
}
}
catch (Exception ex)
{
// Let the user know what went wrong
MessageBox.Show("The file could not be read: ");
MessageBox.Show(ex.Message);
}
}
如果我没看错,你想提取文件信息(创建日期等)。
为此使用 FileInfo class:
https://msdn.microsoft.com/en-us/library/system.io.fileinfo%28v=vs.110%29.aspx
根据您的评论,信息实际上在文件中。这里没有魔法:您必须一个接一个地打开每个文件,然后解析其内容以找到您需要的信息。如果它是一个 XML 文件,C# 中有各种 classes 可以帮助你处理它,例如 XMLReader.
IEnumerable<string> fileContents = Directory.EnumerateFiles("E:", "*.*", SearchOption.TopDirectoryOnly)
.Select(x => new FileInfo(x))
.Where(x => x.CreationTime > DateTime.Now.AddHours(-1) || x.LastWriteTime > DateTime.Now.AddHours(-1))
.Where(x => x.Extension == ".xml" || x.Extension == ".txt")
.Select(file => ParseFile(file));
private string ParseFile(FileInfo file)
{
using (StreamReader sr = new StreamReader(file.FullName))
{
string line;
string endResult;
while ((line = sr.ReadLine()) != null)
{
//Logic here to determine if this is the correct file and append accordingly
endResult += line + Environment.Newline;
}
return endResult;
}
}
这将为您提供文件列表,然后将 FileInfo 对象传递给读取内容的方法,您需要在该方法中添加逻辑以确定文件是否正确。如果是,则开始将您的行附加到 lblDisplay。
使用@IdahoSixString 的回答获取文件
IEnumerable<FileInfo> files = Directory.EnumerateFiles(...
现在迭代它们并获取它们中的每一行
foreach (FileInfo fileInfo in files) {
foreach (string line in File.ReadLines(fileInfo.FullName)) {
lbDisplay.Items.Add(line);
}
}
没有 StreamReader 或 FileReader,没有文件结束测试,没有显式打开或关闭文件。
如果您知道文件的不同位置(文件夹),将它们存储在一个数组中并添加一个循环
var folders = new string[] { "C:\folder1", "C:\folder2", ... };
foreach (string folder in folders) {
IEnumerable<FileInfo> files = Directory
.EnumerateFiles(folder, "*.*", SearchOption.TopDirectoryOnly)
.Select(... ;
foreach (FileInfo fileInfo in files) {
foreach (string line in File.ReadLines(fileInfo.FullName)) {
lbDisplay.Items.Add(line);
}
}
}
在使用 StreamReader 的 C# 中,我必须从多个文件中提取数据。这是我到目前为止的代码。它并不完全正确,我必须对其进行更具体的说明并添加更多内容。我需要 select 各种基于共同日期和时间的个人文件。因此,只有具有共同输入日期和时间的文件才会被 select 提取。问题是文件是不同类型的,例如文本、xml 和 html,它们可能位于不同的位置。我必须一起显示所有提取的数据。任何帮助将不胜感激。谢谢。
private void btnLoad_Click(object sender, RoutedEventArgs e)
{
try
{
var files = Directory.EnumerateFiles("D:\path", "*.*", SearchOption.AllDirectories)
.Where(s => s.EndsWith(".txt") || s.EndsWith(".xml"));
using (StreamReader sr = new StreamReader("files")).
{
string line;
while ((line = sr.ReadLine()) != null)
{
lbDisplay.Items.Add(line);
}
}
}
catch (Exception ex)
{
// Let the user know what went wrong
MessageBox.Show("The file could not be read: ");
MessageBox.Show(ex.Message);
}
}
如果我没看错,你想提取文件信息(创建日期等)。
为此使用 FileInfo class:
https://msdn.microsoft.com/en-us/library/system.io.fileinfo%28v=vs.110%29.aspx
根据您的评论,信息实际上在文件中。这里没有魔法:您必须一个接一个地打开每个文件,然后解析其内容以找到您需要的信息。如果它是一个 XML 文件,C# 中有各种 classes 可以帮助你处理它,例如 XMLReader.
IEnumerable<string> fileContents = Directory.EnumerateFiles("E:", "*.*", SearchOption.TopDirectoryOnly)
.Select(x => new FileInfo(x))
.Where(x => x.CreationTime > DateTime.Now.AddHours(-1) || x.LastWriteTime > DateTime.Now.AddHours(-1))
.Where(x => x.Extension == ".xml" || x.Extension == ".txt")
.Select(file => ParseFile(file));
private string ParseFile(FileInfo file)
{
using (StreamReader sr = new StreamReader(file.FullName))
{
string line;
string endResult;
while ((line = sr.ReadLine()) != null)
{
//Logic here to determine if this is the correct file and append accordingly
endResult += line + Environment.Newline;
}
return endResult;
}
}
这将为您提供文件列表,然后将 FileInfo 对象传递给读取内容的方法,您需要在该方法中添加逻辑以确定文件是否正确。如果是,则开始将您的行附加到 lblDisplay。
使用@IdahoSixString 的回答获取文件
IEnumerable<FileInfo> files = Directory.EnumerateFiles(...
现在迭代它们并获取它们中的每一行
foreach (FileInfo fileInfo in files) {
foreach (string line in File.ReadLines(fileInfo.FullName)) {
lbDisplay.Items.Add(line);
}
}
没有 StreamReader 或 FileReader,没有文件结束测试,没有显式打开或关闭文件。
如果您知道文件的不同位置(文件夹),将它们存储在一个数组中并添加一个循环
var folders = new string[] { "C:\folder1", "C:\folder2", ... };
foreach (string folder in folders) {
IEnumerable<FileInfo> files = Directory
.EnumerateFiles(folder, "*.*", SearchOption.TopDirectoryOnly)
.Select(... ;
foreach (FileInfo fileInfo in files) {
foreach (string line in File.ReadLines(fileInfo.FullName)) {
lbDisplay.Items.Add(line);
}
}
}