在后台工作程序查询中打开目录并处理文件/文件夹

时间:2014-10-17 11:24:35

标签: c# filepath

我有以下代码,我试图打开一个目录并通过后台工作程序处理其中的文件,但我遇到了问题。

我遇到的错误是(当前上下文中不存在名称filePath),我可以理解,因为它存储在另一种方法中?如果有人可以向我指出我的代码有什么问题,我们将不胜感激。 Folderbrowser不在后台工作人员部分工作。

private void btnFiles_Click(object sender, EventArgs e)
    {
        //btnFiles.Enabled = false;
        btnSTOP.Enabled = true;
        //Clear text fields
        listBoxResults.Items.Clear();
        listBoxPath.Items.Clear();
        txtItemsFound.Text = String.Empty;
        //Open folder browser for user to select the folder to scan
        DialogResult result = folderBrowserDialog1.ShowDialog();
        if (result == DialogResult.OK)
        {
            //Store selected folder path
            string filePath = folderBrowserDialog1.SelectedPath;
        }
        //Start the async operation here
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        //Process the folder
            try
            {
                foreach (string dir in Alphaleonis.Win32.Filesystem.Directory.EnumerateFiles(filePath, "*.*", SearchOption.AllDirectories, true))
                {
                    //Populate List Box with all files found
                    this.Invoke(new Action(() => listUpdate2(dir)));
                    FileInfo fi = new FileInfo(dir);
                    if (fi.Length == 0)
                    {
                        //Populate List Box with all empty files found
                        this.Invoke(new Action(() => listUpdate1(dir + Environment.NewLine)));
                    }
                }
            }

            //Catch exceptions
            catch (Exception err)
            {
                // This code just writes out the message and continues to recurse. 
                log.Add(err.Message);
                //throw;
            }
            finally
            {
                //add a count of the empty files here
                txtItemsFound.Text = listBoxResults.Items.Count.ToString();

                // Write out all the files that could not be processed.
                foreach (string s in log)
                {
                    this.Invoke(new Action(() => listUpdate1(s)));
                }
                log.Clear();
                MessageBox.Show("Scanning Complete", "Done", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            //If cancel button was pressed while the execution is in progress
            //Change the state from cancellation ---> cancelled
            if (backgroundWorker1.CancellationPending)
            {
                e.Cancel = true;
                //backgroundWorker1.ReportProgress(0);
                return;
            }
            //}
            //Report 100% completion on operation completed
            backgroundWorker1.ReportProgress(100);
        }

2 个答案:

答案 0 :(得分:3)

@DonBoitnott解决方案是类中最常用的数据流。具体到BackgroundWorker还有一个存在

private void btnFiles_Click(object sender, EventArgs e)
{
    ...
    // pass folder name
    backgroundWorker1.RunWorkerAsync(folderBrowserDialog1.SelectedPath);
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    // get passed folder name
    string filePath = (string)e.Argument;
    ...
}

答案 1 :(得分:1)

变量“filePath”被声明为btnFiles_Click方法的本地变量。为了在其他地方使用它,它必须在代码页中声明为全局:

public class Form1
{
    private String _filePath = null;

    private void btnFiles_Click(object sender, EventArgs e)
    {
        //get your file and assign _filePath here...
        _filePath = folderBrowserDialog1.SelectedPath;
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        //use _filePath here...
    }
}