我正在尝试使用以下代码递归显示tmp文件的数量。但是当我将DirSearch()称为递归目的时;我得到一个错误没有重载方法可以采取1个参数。
namespace TestForm
{
public partial class TEST : Form
{
public TEST()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
TEST search = new TEST();
search.DirSearch();
int result = search.DirSearch();
label1.Text = result.ToString();
}
public int DirSearch()
{
int count = 0;
var sDir = Directory.GetFiles(@"C:\", "*.tmp", SearchOption.AllDirectories);
try
{
foreach (string d in sDir)
{
foreach (string f in Directory.GetFiles(d, "*.tmp"))
{
string extension = Path.GetExtension(f);
if (extension != null && (extension.Equals(".tmp")))
{
count++;
return count;
}
}
DirSearch(d);
}
}
catch (UnauthorizedAccessException)
{
}
}
}
}
答案 0 :(得分:3)
我认为您对您尝试实施的递归算法略有误解。
要使递归方法起作用,它需要对输入进行操作,然后在派生输入上再次(递归地)调用自身。
你的DirSearch()方法不接受任何输入,因此它会一遍又一遍地计算同样的东西。您需要将根路径传递给递归算法将启动的方法,因此签名应更改为:
public int DirSearch(string rootPath)
然后改变:
var sDir = Directory.GetFiles(rootPath, "*.tmp", SearchOption.AllDirectories);
现在在DirSearch方法的主体中,您必须枚举提供的路径中的所有目录,然后使用这些目录的完整路径调用DirSeach方法:
DirSearch(d)
答案 1 :(得分:0)
你对DirSearch()
的定义没有任何争论,所以你不能用方向来称呼它。
也许你可以删除这个
var sDir = Directory.GetFiles(@"C:\", "*.tmp", SearchOption.AllDirectories);
从您的方法并在事件中调用DirSearch()
之前添加它,将第一个sDir
作为参数传递,并在方法定义中添加参数。
此外,您应该考虑正确处理异常
答案 2 :(得分:0)
您是否只是想在C:\驱动器上获取* .tmp文件的数量?如果是这样,这应该可以解决问题:
int fileCount = Directory.GetFiles(@"C:\", "*.tmp", SearchOption.AllDirectories).Length;
也许我错过了一些东西 - 但是我不确定你为什么要在那个方法中做其他所有事情,或者这里的递归点是什么。
答案 3 :(得分:0)
在编写recursive
代码时,您应该保持谨慎。
在你的程序/示例中
signature
必须与DirSearch
匹配。return count;
语句中,代码在计算一个文件后返回。你不算所有这些。请注意,递归伴随着额外的性能压力(可能不适用于所有情况,我会留给你探索你的情况)。
下面的代码可以帮助您完成所需的工作。
public static int DirSearch(string root)
{
int count = Directory.GetFiles(root, "*.tmp", SearchOption.TopDirectoryOnly).Count();
foreach (string dir in Directory.GetDirectories(root))
{
count += Directory.GetFiles(dir, "*.tmp", SearchOption.TopDirectoryOnly).Count();
count += DirSearch(dir);
}
return count;
}
希望这会有所帮助!!