2013年5月23日 星期四

搜尋目錄下所有檔案with pattern

  我的需求是分析一個路徑,此路徑會不定時更新資料,資料夾亦會增加。我的程式是要去掃那一個路徑底下的所有符合的檔案撈出並分析。說了自動化就是只能設一個路徑,需要程式去掃描路徑下所有符合檔案,這時需要以下程式去幫助完成。
  我從此網誌:Getfiles參考而來,但我是使用網誌下留言者的方法,用Recursive簡潔有力。以下是先呈現此Function。

static IEnumerable GetFiles(string dir, string pattern, bool isRecursive)
{
    var dinfo = new DirectoryInfo(dir);
    foreach (FileInfo f in dinfo.GetFiles(pattern))
        yield return f;
    if (isRecursive)
    {
        foreach (DirectoryInfo subdir in dinfo.GetDirectories())
            foreach (FileInfo fi in GetFiles(subdir.FullName, pattern, true))
                yield return fi;
    }
}
  接下來是我的應用,以下以搜尋pdf檔案為例。

private void btnGetFileSet_Click(object sender, EventArgs e)
        {
            if (txtFilePath.Text == "")
            {
                MessageBox.Show("路徑不可為空");
                return;
            }
            DataTable dt = new DataTable();
            DataColumn dc5 = new DataColumn("列", typeof(string));
            dt.Columns.Add(dc5);
            DataColumn dc1 = new DataColumn("檔名", typeof(string));
            dt.Columns.Add(dc1);
            DataColumn dc2 = new DataColumn("建立日期", typeof(string));
            dt.Columns.Add(dc2);
            DataColumn dc3 = new DataColumn("最後存取時間", typeof(string));
            dt.Columns.Add(dc3);
            DataColumn dc4 = new DataColumn("完整路徑", typeof(string));
            dt.Columns.Add(dc4);                      

            IEnumerable fileset = GetFiles(txtFilePath.Text, "*.pdf", true);
            int i = 1;
            foreach (FileInfo fileinfo in fileset)
            {
                DataRow dr = dt.NewRow();
                dr["列"] = i;
                dr["檔名"] = fileinfo.Name;
                dr["建立日期"] = fileinfo.CreationTime.ToString("yyyy/MM/dd HH:mm:ss");
                dr["最後存取時間"] = fileinfo.LastAccessTime.ToString("yyyy/MM/dd HH:mm:ss");
                dr["完整路徑"] = fileinfo.FullName;
                dt.Rows.Add(dr);
                i++;
            }

            bindingSource1.DataSource = dt;
            dGV.AutoGenerateColumns = true;
            dGV.DataSource = bindingSource1;
        }
  我寫在一個button_click事件中,我搜尋的條件是"*.pdf",意思就是結尾為.pdf的檔案,然後將符合搜尋條件的檔案的檔名,建立日期,最後存取時間,完整路徑等資訊列在DataGridView當中。其中用Function的結果:IEnumerable<fileinfo>再用foreach的方式將每一個fileinfo的資訊列加入至datatable完成,Recursive好壓。
  更正:以上程式碼均出現IEnumerable 改為 IEnumerable<fileinfo>,我用的顯示程式碼模板會將<fileinfo>當作html碼沒有秀在上面,請善用。

沒有留言:

張貼留言