using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.IO;


namespace picMaker
{
    /// <summary>
    /// 变量定义的很混乱凑合看吧呵呵
    /// 注意FileSystemInfo是DirectoryInfo和FileInfo的基类,这个很重要
    /// 本程序模拟的是桌面文件的遍历,可以根据需要更改
    /// 从效率上来说 :递归要稍强点
    /// </summary>
    public partial class Form1 : Form
    {
        private Stack<FileSystemInfo> fileStack = new Stack<FileSystemInfo>();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {//递归遍历
            textBox1.Text = "";
            DateTime d = DateTime.Now;
            getFilesName(new DirectoryInfo(@"C:\Users\pc2\Desktop"));//C:在win7下存在不可访问的文件夹
            label1.Text = (DateTime.Now.Subtract(d).Ticks / 1000).ToString();
            label1.Text += "微秒";
        }
        private void button2_Click(object sender, EventArgs e)
        {//栈遍历
            fileStack.Clear();
            //初始化栈
            fileStack.Push(new DirectoryInfo(@"C:\Users\pc2\Desktop"));
            textBox1.Text = "";
            DateTime d = DateTime.Now;
            getFilesNameByStack();
            label2.Text = (DateTime.Now.Subtract(d).Ticks / 1000).ToString();
            label2.Text += "微秒";
        }

        private void getFilesNameByStack()
        {//栈遍历
            while (fileStack.Count != 0)
            {
                FileSystemInfo ff = fileStack.Pop();
                FileInfo f = ff as FileInfo;
                if (f != null)
                {
                    outFileName(f);
                }
                else
                {
                    DirectoryInfo di = ff as DirectoryInfo;
                    FileSystemInfo[] fsi = di.GetFileSystemInfos();//取得所有文件和文件夹
                    foreach (FileSystemInfo f0 in fsi)
                    {
                        fileStack.Push(f0);
                    }                   
                }
            }
        }
        private void getFilesName(FileSystemInfo name)
        {//递归遍历
            FileInfo f = name as FileInfo;
            if (f != null)
            {//是文件
                outFileName(f);
            }
            else
            { //是文件夹
                DirectoryInfo di = name as DirectoryInfo;//记得此处为name哦
                FileSystemInfo[] fsi = di.GetFileSystemInfos();//取得所有文件和文件夹
                foreach (FileSystemInfo ff in fsi)
                {
                    FileInfo fff = ff as FileInfo;
                    if (fff != null)
                    {
                        outFileName(fff);
                    }
                    else
                    {
                        getFilesName(ff);//此处为ff哦
                    }
                }
            }
        }
        private void outFileName(FileInfo f)
        {
            if (f.Name.Length > 4)
            {
                string s = f.Name.Substring(f.Name.Length - 4, 4);
                if (s == ".ini")
                {
                    return;
                }
            }
            textBox1.Text += f.Name + "\r\n";
        }
    }
}