2014년 12월 2일 화요일

C#으로 구현한 하위 폴더에서 특정 확장자의 파일 갯수를 카운트하는 프로그램.

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

namespace FileCounter
{
    public partial class FileCounter : Form
    {
        private int counter = 0;

        public FileCounter()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void txtFolderPath_TextChanged(object sender, EventArgs e)
        {

        }

        private void btnOpenFolderDlg_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
            folderBrowserDialog.SelectedPath = @"C\";

            if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
            {
                txtFolderPath.Text = folderBrowserDialog.SelectedPath;
            }
        }

        private void btnFileCount_Click(object sender, EventArgs e)
        {
            //파일을 찾아야 폴더 선택 여부 확인
            if (txtFolderPath.Text == "" || txtFolderPath.Text.Length < 1)
            {
                MessageBox.Show("대상 폴더를 선택하세요. !!");
                return;
            }

            //찾아야 할 파일 확장자 입력 여부 확인
            if (txtFileExt.Text == "" || txtFileExt.Text.Length < 1)
            {
                MessageBox.Show("파일 확장자를 입력하세요. !!");
                return;
            }

            lbCount.Text = "";
            counter = 0;

            //Root폴더 아래의 파일 검색
            RootSearchFileExtCounter(txtFolderPath.Text, txtFileExt.Text);
            //하위 폴더 아래의 파일 검색
            DirSearchFileExtCounter(txtFolderPath.Text, txtFileExt.Text);
           
            lbCount.Text = "" + counter;          
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            //종료
            this.Close();
        }

        //Root폴더 아래의 파일을 검색
        void RootSearchFileExtCounter(string sDir, string sExt)
        {
            //입력된 파일 확장자에서 순수한 확장자만 추출
            string strExt = sExt;
            if (sExt.IndexOf("*") > -1) strExt = strExt.Replace("*", "");
            if (sExt.IndexOf(".") > -1) strExt = strExt.Replace(".", "");

            //검색을 위한 패턴 생성
            string searchPattern = "*." + strExt;

            string[] rootFileEntries = Directory.GetFiles(sDir, searchPattern);
            foreach (string rootFileName in rootFileEntries)
            {
                //순수 확장자가 파일명의 끝에 있는지 체크해서 카운트.
                if (rootFileName.EndsWith(strExt))
                {
                    counter = counter + 1;
                }
            }
        }

        void DirSearchFileExtCounter(string sDir, string sExt)
        {
            string strExt = sExt;
            if (sExt.IndexOf("*") > -1) strExt = strExt.Replace("*", "");          
            if (sExt.IndexOf(".") > -1) strExt = strExt.Replace(".", "");          

            string searchPattern = "*." + strExt;

            try
            {              
                //Root폴더 아래의 하위 폴더 갯수 만큼 Looping
                foreach (string d in Directory.GetDirectories(sDir))
                {
                    //searchPattern에 맞는 파일 목록을 가져온다.
                    string[] searchFileEntries = Directory.GetFiles(d, searchPattern);
                    //가져온 파일 목록만큼 Looping
                    foreach (string sFileName in searchFileEntries)
                    {
                        //순수 확장자가 파일명의 끝에 있는지 체크해서 카운트.
                        if (sFileName.EndsWith(strExt))
                        {
                            counter = counter + 1;
                        }
                    }
                    //하위 폴더 검색을 위한 재귀호출
                    DirSearchFileExtCounter(d, searchPattern);
                }
            }
            catch (System.Exception excpt)
            {
                Console.WriteLine(excpt.Message);
            }          
        }
    }
}