C# 以递归方式获取文件数

C# 以递归方式获取文件数,c#,C#,我正在计算计算机中*.tmp文件的数量。当我点击一个按钮时,labelbox应该开始增加.tmp文件每次搜索的计数。我下面的代码似乎不起作用 非常感谢您的帮助。 当我点击按钮获取tmp文件的数量时;标签框应开始显示计数的增加,如1,2、、、、、56、、89、、等,而不仅仅显示文件总数 namespace finalclean { public partial class FinalClean : Form { public FinalClean() { Initia

我正在计算计算机中*.tmp文件的数量。当我点击一个按钮时,labelbox应该开始增加.tmp文件每次搜索的计数。我下面的代码似乎不起作用

非常感谢您的帮助。 当我点击按钮获取tmp文件的数量时;标签框应开始显示计数的增加,如1,2、、、、、56、、89、、等,而不仅仅显示文件总数

namespace finalclean {

public partial class FinalClean : Form {

    public FinalClean() {

        InitializeComponent();
    }

    int count = 0; 

    private void button1_Click(object sender, EventArgs e) {

       String path = Environment.ExpandEnvironmentVariables(@"c:\windows");

       try {

          foreach (string dirPath in Directory.GetDirectories(path)) {

               foreach (string filePath in Directory.GetFiles(dirPath)) {

                   string filename = Path.GetFileName(filePath);

                   if (filename.Equals("*.tmp")) {
                       count++;
                   }
               }
           }
       }
         catch (System.Exception excpt) {
             //Console.WriteLine(excpt.Message);
         }
       textBox1.Text = (count.ToString());
    }

  }

}

您的代码无法工作,因为您没有访问所有目录,而只访问第一个目录(C:\Windows)

如果你让它递归,它可以帮你

internal class Program
{
    private static void Main(string[] args)
    {
        var myClass = new Visitor();
        myClass.OnNewFileFound +=Progress;
        myClass.CountTmpFiles();
        Console.Read();
    }

    private static void Progress(int i)
    {
        Console.WriteLine(i); //update textbox here
    }
}

public class Visitor
{
    public event Action<int> OnNewFileFound;
    private int count = 0;

    public int CountTmpFiles()
    {
        var path = Environment.ExpandEnvironmentVariables(@"c:\windows");
        VisitDir(path);
        return count;
    }

    private void VisitDir(string path)
    {
        try
        {
            foreach (var directory in Directory.GetDirectories(path))
            {
                VisitDir(directory); //recursive call here
            }
            foreach (var filePath in Directory.GetFiles(path, "*.tmp", SearchOption.TopDirectoryOnly))
            {
                count++;
                if (OnNewFileFound != null)
                {
                    OnNewFileFound(count);
                }
            }
        }
        catch (System.Exception excpt)
        {
            //Console.WriteLine(excpt.Message);
        }
    }
}
内部类程序
{
私有静态void Main(字符串[]args)
{
var myClass=新访问者();
myClass.OnNewFileFound+=进度;
myClass.CountTmpFiles();
Console.Read();
}
私有静态无效进度(int i)
{
Console.WriteLine(i);//此处更新文本框
}
}
公务舱访客
{
发现公共事件行动文件;
私有整数计数=0;
公共int CountTmpFiles()
{
var path=Environment.ExpandEnvironmentVariables(@“c:\windows”);
VisitDir(路径);
返回计数;
}
专用void VisitDir(字符串路径)
{
尝试
{
foreach(directory.GetDirectories(path)中的var目录)
{
VisitDir(目录);//此处递归调用
}
foreach(目录.GetFiles中的var filePath(路径“*.tmp”,SearchOption.TopDirectoryOnly))
{
计数++;
如果(OnNewFileFound!=null)
{
已找到ONNEWFILE(计数);
}
}
}
捕获(系统异常excpt)
{
//控制台写入线(除消息外);
}
}
}
是的,如果您只计算文件,那么我没有理由编写您自己的代码。您只需按照Andrew和Hamlet Hakobyan的建议使用目录。枚举文件。

您只需使用:

var count = Directory.EnumerateFiles(@"C:\Windows\", "*.tmp", 
                      SearchOption.AllDirectories).Count();

请看@HamletHakobyan,不幸的是它没有报告进度。@Antonizikov它重新运行
可枚举文件
,这样您就可以报告进度了。
String path=Environment.ExpandEnvironmentVariables(@“c:\windows”)这是没有意义的。@HamletHakobyan嗯,你说得对,这不是一个列表。问题是我们不能在这里报告进度。谢谢你……我会努力实施的this@AntonSizikov如果删除计数并将结果聚合到一个循环中,则可以在该循环中发布进度。因为IEnumerable在你枚举它的时候是惰性的,这就是@PraveenGowda所要求的。我的观点是您的解决方案不完整。谢谢,但我收到一个错误“system.IO.Directory不包含枚举文件的定义”。我尝试安装.NETFramework 3.5,4,4.5.2。但是没有运气。我正在使用visual studio 2008谢谢。让我两个都试试