【问题标题】:Sorting files in a directory by date in c# using directory.get files()在c#中使用directory.get files()按日期对目录中的文件进行排序
【发布时间】:2014-12-23 12:11:48
【问题描述】:

目前我有我的代码可以从目录中获取一些文件。

foreach (var file in
            Directory.GetFiles(MainForm.DIRECTORY_PATH, "*.csv"))
            {
                //Process File
                string[] values = File.ReadAllLines(file)
                .SelectMany(lineRead => lineRead.Split(',')
                .Select(s => s.Trim()))
                .ToArray();

我希望能够在开始阅读和处理它们之前先按日期顺序对这些文件进行排序。

我查看了关于 MDSN 使用 DirectoryInfo 的建议:

        DirectoryInfo DirInfo = new DirectoryInfo(MainForm.DIRECTORY_PATH);
        var filesInOrder = from f in DirInfo.EnumerateFiles()
                           orderby f.CreationTime
                           select f;

        foreach (var item in filesInOrder)
        {
             //Process File
                string[] values = File.ReadAllLines(item )
                .SelectMany(lineRead => lineRead.Split(',')
                .Select(s => s.Trim()))
                .ToArray();
        }

但这不起作用,因为 System.IO.File.ReadAllLine(file) 似乎出现错误,因为 item 是字符串而不是实际文件。 :(

有没有人知道这个问题的解决方案或遇到过类似的问题? :)

问候 J.

【问题讨论】:

    标签: c# file directory iostream


    【解决方案1】:

    From MSDN File.ReadAllLines(string path) 将文件路径作为输入。

    打开一个文本文件,读取文件的所有行,然后关闭文件。

    你必须传递文件路径:

    string[] values = File.ReadAllLines(item.FullName)
    

    你的代码:

    foreach (var item in filesInOrder)
    {
    
      string[] values = File.ReadAllLines(item.FullName)
                        ...............................
                        ...............................
    
    }
    

    您可以通过 lambda 表达式将所有块替换为以下代码:

    var values = DirInfo.EnumerateFiles().OrderBy(f => f.CreationTime)
                        .Select(x => File.ReadAllLines(x.FullName)
                                     .SelectMany(lineRead => lineRead.Split(',')
                                     .Select(s => s.Trim())).ToArray()
                               );
    

    【讨论】:

    • Aaaahh 我和你在一起 :) 感谢您澄清这一点 :)
    【解决方案2】:

    您的第一个代码 sn-p 读取 one 文件中的所有行,而第二个代码读取目录中的所有文件。所以不是很清楚你想做什么。

    第二个代码 sn-p 不能工作,因为变量values 是在循环内声明的。它的可见范围仅限于循环的代码块。因此,结果将永远不会在循环之外可见。

    var filesInOrder = from f in DirInfo.EnumerateFiles() ...;
    var items = new List<string>();
    foreach (FileInfo f in filesInOrder) {
        using (StreamReader sr = f.OpenText()) {
            while (!sr.EndOfStream) {
                items.AddRange(sr.ReadLine().Split(','));
            }
        }
    }
    

    在这里,我在循环之前定义了一个List&lt;string&gt;,它将保存所有文件的所有项目。我们需要两个循环:一个循环遍历文件 (foreach),另一个循环读取每个文件中的行并连续将项目添加到列表中 (while)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多