关键部分代码:
private void btnProcess_Click(object sender, EventArgs e)
{
//string[] files = System.IO.Directory.GetFiles(txtPath.Text, "*.xls", SearchOption.AllDirectories);
rtxtResult.Text = "";
m_path = txtPath.Text;
m_ext = txtExt.Text;
m_filesCount = 0;
m_bgworker = new BackgroundWorker();
m_bgworker.WorkerReportsProgress = true;
m_bgworker.WorkerSupportsCancellation = true;
m_bgworker.DoWork += new DoWorkEventHandler(FindFiles);
m_bgworker.ProgressChanged += new ProgressChangedEventHandler(ReportProgress);
m_bgworker.RunWorkerAsync(m_path);
}
private void FindFiles(object sender, DoWorkEventArgs dwea)
{
BackgroundWorker _worker = sender as BackgroundWorker;
string _path = dwea.Argument.ToString();
ErgodicFilesInFolder(_worker, _path, m_ext);
}
private void ReportProgress(object sender, ProgressChangedEventArgs e)
{
string _fliename = e.UserState.ToString();
rtxtResult.AppendText(_fliename + System.Environment.NewLine);
rtxtResult.ScrollToCaret();
m_filesCount++;
lblCount.Text = m_filesCount.ToString();
}
DirectoryInfo _dir = null;
/// <summary>
/// 遍历指定路径下所有指定扩展名的文件
/// </summary>
/// <param name="path">指定路径</param>
/// <param name="ext">文件扩展名,不包含分隔符(.)</param>
/// <returns>返回所有文件绝对路径</returns>
private void ErgodicFilesInFolder(BackgroundWorker worker, string path, string extension)
{
//
if (worker.CancellationPending)
{
return;
}
FileSystemInfo[] _fsi = null;
try
{
_dir = new DirectoryInfo(path);
_fsi = _dir.GetFileSystemInfos();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return;
}
FileInfo _fi;
try
{
for (int i = 0; i < _fsi.Length; i++)
{
if (!Directory.Exists(_fsi[i].FullName))
{//是文件
_fi = new FileInfo(_fsi[i].FullName);
//判断文件扩展名
if (m_ext.Length > 0)
{//要求扩展名
if (_fi.Extension == m_ext)
{
worker.ReportProgress(0, _fi.FullName);
}
}
else
{
worker.ReportProgress(0, _fi.FullName);
}
}
else
{//是目录,继续遍历
ErgodicFilesInFolder(worker, _fsi[i].FullName, extension);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
//
上下文“0x1a1978”已断开连接。正在从当前上下文(上下文 0x1a1808)释放接口。这可能会导致损坏或数据丢失。要避免此问题,请确保在应用程序全部完成 RuntimeCallableWrapper (表示其内部的 COM 组件)之前,所有上下文/单元都保持活动状态。