我写了一个方法,需要查找路径中的所有文件,我想使用递归获取所有文件。这是我目前的方法:
public void doStart(DirectoryInfo dir, string filePattern)
{
try
{
foreach (FileInfo fileInfo in dir.GetFiles(filePattern))
{
if (fileFound != null)
{
fileFound(fileInfo);
}
}
}
catch (Exception)
{
}
try
{
foreach (DirectoryInfo dirInfo in dir.GetDirectories())
{
doStart(dirInfo, filePattern);
}
}
catch (Exception)
{
}
}
public void Start(string path, string filePattern)
{
doStart(new DirectoryInfo(path), filePattern);
}
有没有更好的方法来编写这种递归或者这是否足够好?
答案 0 :(得分:7)
尝试这样的事情:
string[] filePaths = Directory.GetFiles(@dir, "*.filetype", SearchOption.AllDirectories);
这将以递归方式查看目录,查找具有特定文件类型('。filetype')的所有文件,并返回包含所有找到的文件的字符串数组。
此外,我建议不要使用空的catch块,因为如果出现问题,您的应用程序将不会让您知道。显示消息框(或类似内容)或将其记录到数据库或其他内容。
此外,如果子目录中有子目录,您的DoStart()方法会做什么?从我所看到的情况来看,我说它只搜索1个子级。
答案 1 :(得分:1)
DoStart
和`FileFound'OnFileFound
方法而不是直接调用FileFound
(我假设fileFound
是一个事件处理程序?)除此之外我觉得很好。
答案 2 :(得分:0)
这是一个真正递归的例子。这将搜索,直到找不到更多的子目录,这与Directory.GetFiles SearchOption.AllDirectories不同。您可以修改此选项以将搜索过滤器添加为参数。
public IEnumerable<string> GetFilesRecursive(string ParentDirectory)
{
string[] subDirectories = Directory.GetDirectories(ParentDirectory);
foreach (string file in Directory.GetFiles(ParentDirectory))
{
yield return file;
}
foreach (string subDirectory in subDirectories)
{
foreach (string file in GetFilesRecursive(subDirectory))
{
yield return file;
}
}
}