访问搜索结果

时间:2013-01-15 14:57:48

标签: c# winforms search

我正在开发一个winform应用程序,它将搜索指定源目录的文件名中的字符串。问题是我需要访问该文件..

示例:搜索结果为.flv或.swf - 搜索完成后,应该可以访问结果。

这是我到目前为止所拥有的......

private void button1_Click(object sender, EventArgs e)
        {

            txtOutput.Text = "";

            foreach (string file in Directory.GetFiles("C:\\Users\\John\\Desktop\\Sample"))
                if (Path.GetFileName(file).Contains(txtSearch.Text))
                    txtOutput.Text += txtOutput.Text + file + ", ";
        }

使用此代码,我能够搜索文件,但无法访问..搜索的输出也带有文件的路径..(类似于这样的c:\ users \ John \ desktop \ sample \ Filename.swf)我只需要一个文件名,而不是整个路径..

我使用多行文字框输出,我应该使用别的东西吗? ..如果你有更好的建议,请帮助我。

3 个答案:

答案 0 :(得分:1)

如果您要查找具有特定扩展名的文件,请使用EnumerateFilesDirectory.GetFiles方法的搜索模式。还可以使用Path.GetFileName从文件路径中获取文件名:

var path = "C:\\Users\\John\\Desktop\\Sample";
txtOutput.Text = String.Join(", ", Directory.GetFiles(path, "*" + txtSearch.Text)
                                            .Select(f => Path.GetFileName(f));

您的txtSearch.Text假设有搜索文件的扩展名(即.swf.flv)。因此,搜索模式将为*.swf*.flv

因此,如果您的搜索文本框中包含文本.swf并且示例目录中有两个sfw文件,那么您将获得file1.swf, file2.swf的输出。


如果要搜索文件名中的任何子字符串:

var path = "C:\\Users\\John\\Desktop\\Sample";
txtOutput.Text = 
     String.Join(", ", Directory.GetFiles(path, "*" + txtSearch.Text + "*")
                                .Select(f => Path.GetFileName(f)));

而不是多行文本框,使用listbox显示文件:

listBox1.DataSource = Directory.GetFiles(path, "*" + txtSearch.Text + "*")
                               .Select(f => Path.GetFileName(f))
                               .ToList();

更新:打开文件

private void listBox1_DoubleClick(object sender, EventArgs e)
{
    var fileName = listBox1.SelectedItem as string;
    if (fileName != null)
    {
        var path = Path.Combine("C:\\Users\\John\\Desktop\\Sample", fileName);
        Process.Start(path);
    }
}

答案 1 :(得分:1)

你接近了,我将做一些改变:

创建ListBox而不是多行文本框。它允许您甚至在某个项目上处理双击。对于我的示例,ListBox名称是ListBox1。

将button1_Click方法更改为:

private void button1_Click(object sender, EventArgs e)
    {
        // You can add your seach text right to the GetFiles command, this will only  return files that match. 
        // You can set the list of of items int he ListBod to the result of GetFiles instead of having to loop through as well.
        listBox1.Items.AddRange(Directory.GetFiles(@"C:\Users\John\Desktop\Sample", "*" + txtSearch.Text + "*"));
    }

然后处理ListBox1_DoubleClick:

    private void listBox1_DoubleClick(object sender, EventArgs e)
    {
        // This will run whatever file name the user double-clicked
        System.Diagnostics.Process.Start(listBox1.SelectedItem.ToString());
    }

答案 2 :(得分:0)

    private void button1_Click(object sender, EventArgs e)
    {

        txtOutput.Text = "";
        List<string> fileNames = new List<string>();
        foreach (string file in Directory.GetFiles("C:\\Users\\John\\Desktop\\Sample")){
            if (Path.GetFileName(file).Contains(txtSearch.Text)){
                txtOutput.Text += txtOutput.Text + file + ", ";
                fileNames.Add(file);
            }
        }

    }

所以在这里你可以使用fileNames List中的文件。

相关问题