我從此網誌: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碼沒有秀在上面,請善用。
沒有留言:
張貼留言