使用directory.get文件()在c#中按日期对目录中的文件进行排序

时间:2014-12-23 12:11:48

标签: c# file directory iostream

目前我有我的代码从Dir获取一些文件。

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(文件)似乎与错误一致,因为item是字符串而不是实际文件。 :(

有没有人知道解决方案或有类似问题? :)

此致 学家

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您的第一个代码段读取一个文件中的所有行,其中第二个代码段读取目录中的所有文件。所以你想做什么并不是很清楚。

第二个代码段不起作用,因为变量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<string>,它将包含所有文件的所有项目。我们需要两个循环:一个循环遍历文件(foreach),另一个循环读取每个文件中的行,并连续将项添加到列表中(while)。