从不同位置的多个类型文件中读取

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