在列表框中获取所选文件的当前文件夹名称

时间:2017-10-18 11:17:33

标签: c# winforms

我有TextBox来搜索主文件夹中的文件,它也有子文件夹。我想获取ListBox中所选项目的当前文件夹名称,以便在另一个ListBox中显示。

我该怎么做?

我最近的努力:

这是我的完整编码!!

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        string path = @"C:\Users\guest\Desktop\test\";

        listBox2.Items.Clear();

        {
            listBox2.Items.Add(Path.GetDirectoryName(path));
        }
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        DirectoryInfo sdir = new DirectoryInfo(@"C:\Users\guest\Desktop\test");
        FileInfo[] files = sdir.GetFiles(textBox1.Text.ToString() + "*", System.IO.SearchOption.AllDirectories);
        string search = "";

        listBox1.Items.Clear();

        foreach (FileInfo file in files)
        {
            search = file.Name;
            listBox1.Items.Add(Path.GetFileNameWithoutExtension(search));
        }
    }

标记为红色的所需输出请参阅下方的快照。

文件名搜索并获取完整路径 Filename search and get full path

1 个答案:

答案 0 :(得分:0)

问题在于,当您添加到listBox1时,您正在添加string - 然后会丢失其原始路径的上下文。解决方案是添加object(例如TestPath) - 可以ToString添加到您想要的文本中,但仍保留其原始路径的上下文

以下可能会帮助您实现这一目标。

添加此课程:

public class TestPath
{
    public FileInfo Original { get; private set; }

    public TestPath(FileInfo original)
    {
        Original = original;
    }

    public override string ToString()
    {
        return Path.GetFileNameWithoutExtension(Original.Name);
    }
}

然后替换:

foreach (FileInfo file in files)
{
    search = file.Name;
    listBox1.Items.Add(Path.GetFileNameWithoutExtension(search));
}

使用:

foreach (FileInfo file in files)
{
    var path = new TestPath(file);
    listBox1.Items.Add(path);
}

然后替换:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    string path = @"C:\Users\guest\Desktop\test\";

    listBox2.Items.Clear();

    {
        listBox2.Items.Add(Path.GetDirectoryName(path));
    }
}

使用:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    listBox2.Items.Clear();

    var currentItem = listBox1.SelectedItem as TestPath;
    listBox2.Items.Add(currentItem.Original.FullName); // or any property
}