过去几周我一直在学习C#,慢慢地我越来越好但是我遇到了一个我无法理解的问题。
首先,如果我不按LastWriteTime对它们进行排序,我可以读取我的文件数组。
mDirectory = @"\\11.11.11.11\Excel";
mFiles = System.IO.Directory.GetFiles(mDirectory, "*.xls");
foreach (string file in mFiles)
{
................
}
这没有问题。但我需要按修改日期对文件列表进行排序。所以我使用了以下
if (Directory.Exists(mDirectory))
{
DirectoryInfo di = new DirectoryInfo(mDirectory);
FileInfo[] logFiles = di.GetFiles("*.xls");
DateCompareFileInfo dateCompareFileInfo = new DateCompareFileInfo();
Array.Sort(logFiles, dateCompareFileInfo);
Array.Reverse(logFiles);
对此课程的哪些调用 -
class DateCompareFileInfo : IComparer<FileInfo>
{
public int Compare(FileInfo fi1, FileInfo fi2)
{
int result;
if (fi1.LastWriteTime == fi2.LastWriteTime)
{
result = 0;
}
else if (fi1.LastWriteTime < fi2.LastWriteTime)
{
result = 1;
}
else
{
result = -1;
}
return result;
}
}
我已经调试过来检查文件是否按照我想要的方式排序并完美。
所以现在我想读取像这样的文件 -
foreach (string file in logFiles)
{
...........
}
当我运行它时出现以下错误错误2无法将类型'System.IO.FileInfo'转换为'string'
如果有人能说清楚我做错了什么,我会非常感激。
答案 0 :(得分:1)
关于 &#34;当我运行它时,我收到以下错误错误2无法转换类型&#39; System.IO.FileInfo&#39;到&#39;字符串&#39;&#34;
foreach (var fileInfo in logFiles)
{
var path = fileInfo.FullName;
//do whatever you want
}
或
foreach (var filePath in logFiles.Select(fileInfos=>fileInfos.FullName))
{
//do whatever you want, filePath will be string which already contains FullName
}
答案 1 :(得分:1)
foreach (FileInfo file in logFiles)
{
var name = fileInfo.Name;
...........
}
我建议你一直使用这种语法
foreach(var file in logFiles)
然后将鼠标放在var上并等待它将显示类型
答案 2 :(得分:1)
foreach (string file in logFiles)
{
...........
}
在您的代码中,logFiles是一个FileInfo类型的数组,您尝试将logFiles作为字符串进行迭代。 FileInfo也不是从字符串继承的,因此无法转换为字符串。 为此,您需要使用'var'或确切类型。
foreach (var file in logFiles)
{
...........
}
或
foreach (FileInfo file in logFiles)
{
...........
}
答案 3 :(得分:1)
第一个变体工作的主要问题,但第二个不是你使用两种不同的返回类型的方法(在我对这个问题的评论中可以看出我也偶然发现,所以它很容易发生方法本身具有相同的名称。)
使用.NET始终要记住的一件事是,您使用来自不同名称空间的同名方法来执行不同的操作。但现在是主题。
首先你使用了:
System.Io.Directory.GetFiles
此方法返回一个字符串数组。这就是为什么你可以使用foreach分别将它存储在字符串中。
然后在第二个示例中,您使用了DirectoryInfo中的GetFiles方法。这与其他方法具有相同的基本功能BUT返回FileInfo对象数组而不是字符串对象。
这就是为什么foreach(字符串.......)对DirectoryInfo Getfiles的结果失败的原因,因为foreach期望字符串作为数组的元素而不是FileInfo对象。
所以你可以做的是两件不同的事情
转换返回的数组,以便获取字符串而不是FileInfos
因此选项2我们可以忘记。因此,让我们看一下选项1.在这里,您可以迭代返回的数组,只需要FileInfo对象。如果你需要&#34;文件&#34;你可以把它放在foreach循环中。因此把它们放在一起:
foreach (FileInfo fileInfo in mFiles)
{
string file = fileInfo.FullName;
// that is if you want the FULL path included else only
// fileInfo.Name instead of fileInfo.FullName
}