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