我有以下代码,我想一次返回一个FileInfo对象,但是我收到了显示的错误消息:
public static FileInfo GetTextFile(string path, string pattern, SearchOption searchoption)
{
DirectoryInfo dirs = new DirectoryInfo(path);
var files = dirs.EnumerateFiles(pattern, searchoption);//Getfiles is eager
foreach (var file in files)
{
return file;
}
}
' FileEnumarater.GetTextFile(string,string,SearchOption)':并非所有代码路径都返回值
我在网上进行了一些调查,发现我需要使用"收益率"为了这个工作,所以我将代码更改为此,错误消失了:
public static IEnumerable<FileInfo> GetTextFile(string path, string pattern, SearchOption searchoption)
{
DirectoryInfo dirs = new DirectoryInfo(path);
var files = dirs.EnumerateFiles(pattern, searchoption);//Getfiles is eager
foreach (var file in files)
{
yield return file;
}
}
然而,当我调试我希望一次一行地执行此代码,但这不会发生。从下面的调用代码中,调试器不会进入静态类,而是直接突出显示的代码。
为了实现这一目标,还需要改变什么呢?我读到我需要通过添加.ToList()
强制执行代码,我在第一个屏幕截图中执行了这个操作,但它没有帮助。
也许我把它放在了错误的地方?
这是我的调用代码,它只是控制台应用程序中的主要方法。调试器跨越高亮度线:
static void Main(string[] args)
{
string path = @"G:\General\";
var x = FileEnumarater.GetTextFile(path, "cmb*.txt", SearchOption.AllDirectories);//add ToList to force evaluation
}
答案 0 :(得分:1)
您需要迭代从GetTextFile
返回的序列。您可以使用ToList
来强制迭代,但是您需要在返回的序列上使用它,而不是从DirectoryInfo.GetFiles
返回的序列,即
var x = FileEnumerator.GetTextFile(path, "*list.txt", SearchOption.AllDirectories).ToList();
如果要从自己的代码中逐步执行控制流,可以使用foreach
手动迭代结果序列:
foreach(FileInfo fi in FileEnumerator.GetTextFile(path, "*list.txt", SearchOption.AllDirectories))
{
//process result
}
请注意,DirectoryInfo.GetFiles
已经返回IEnumerable<FileInfo>
,因此您可以直接返回它,而不是将其转换为延迟序列:
DirectoryInfo dirs = new DirectoryInfo(path);
return dirs.GetFiles(pattern, searchOption);
如果您希望懒散地检索结果,则应使用DirectoryInfo.EnumerateFiles
代替GetFiles
,这是急切的:
return dirs.EnumerateFiles(pattern, searchOption);
答案 1 :(得分:0)
您的代码没有所有代码路径的返回值,因为在文件是空数组的情况下,永远不会到达foreach循环内的return语句。当文件是空数组时,您应该处理这种情况。顺便说一下,你的代码总是返回&#34;文件中的第一项&#34;阵列。这是你的意图吗?