目前我有我的代码从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是字符串而不是实际文件。 :(
有没有人知道解决方案或有类似问题? :)
此致 学家
答案 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
)。