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

时间:2015-04-09 21:11:49

标签: c# streamreader

在使用StreamReader的C#中,我必须从多个文件中提取数据。这是我到目前为止的代码。它不完全正确,我必须更加具体,并添加更多。我需要根据它们共有的日期和时间选择各种单独的文件。因此,仅选择具有共同输入日期和时间的文件进行提取。问题是文件是不同的类型,例如text,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);
        }
    }

3 个答案:

答案 0 :(得分:2)

    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。

答案 1 :(得分:1)

使用@ IdahoSixString的答案获取文件

IEnumerable<FileInfo> files = Directory.EnumerateFiles(...

现在迭代它们并得到每条线的

foreach (FileInfo fileInfo in files) {
    foreach (string line in File.ReadLines(fileInfo.FullName)) {
        lbDisplay.Items.Add(line);
    }
}

没有StreamReaders或FileReaders,没有测试文件结尾,没有明确打开或关闭文件。


如果您知道文件的不同位置(文件夹),请将它们存储在数组中并添加循环

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

答案 2 :(得分:0)

如果我做对了,你想提取文件信息(创建日期等)。

使用FileInfo类:

https://msdn.microsoft.com/en-us/library/system.io.fileinfo%28v=vs.110%29.aspx

根据您的评论,信息实际上在文件中。这里没有魔力:你必须一个接一个地打开每个文件,并解析其内容以找到你需要的信息。如果它是一个XML文件,C#中有各种类可以帮助您,例如XMLReader