0

我正在开发一个 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 ) 我只需要一个文件名,而不是整个路径..

我正在使用多行文本框进行输出,我应该使用其他东西吗?..如果您有更好的建议,请帮助我。

4

3 回答 3

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)。因此搜索模式将是*.swfor *.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)));

而不是多行文本框,使用列表框来显示文件:

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);
    }
}
于 2013-01-15T15:27:46.177 回答
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());
    }
于 2013-01-15T15:44:49.890 回答
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);
            }
        }

    }

所以在这里你可以使用文件名列表中的文件。

于 2013-01-15T15:20:31.767 回答