如何获取列表框中列出的文件的实际路径?

时间:2018-02-13 10:12:20

标签: c# listbox

我有一个列表框,列出某个目录中的某些文件。 我添加了一个消息框,当我点击任何列表项时,它会显示文件的路径。 但是,当我单击列表框中的任何文件名,而不是显示实际路径时,它会显示项目文件路径。

以下是我的代码:

 private void btnrecprefresh_Click(object sender, EventArgs e)
    {
        string[] files = Directory.GetFiles(@"C:\testt", "*.txt", SearchOption.AllDirectories);

        foreach (string f in files)
        {
            string modelpath = Path.GetFullPath(f);
            string entry = Path.GetFileName(f);
            Listbox.Items.Add(entry);
        }
    }

    private void Listbox_SelectedIndexChanged(object sender, EventArgs e)
    {

        string selectedItems = Listbox.SelectedItems.ToString();
        string all = Path.GetFullPath(selectedItems);
        MessageBox.Show(all);
    }

它不是将路径显示为C:\ testt \ xyz.txt,而是将路径显示为C:\ Users \ Production \ Desktop \ Project1 \ bin \ Release \ System.Windows.Forms.ListBox + SelectedObjectCollection

为阿巴斯编辑:

public frmMain()
{
    InitializeComponent();
    Listbox.DisplayMember = "Title";
    Listbox.ValueMember = "Path";
}

public class FileItem
{
    public string Title { get; set; }
    public string Path { get; set; }
}

private void btnrecprefresh_Click(object sender, EventArgs e)
{
    string[] files = Directory.GetFiles(@"C:\testt", "*.txt", SearchOption.AllDirectories);

    foreach (string f in files)
    {
        var fileItem = new FileItem { Title = Path.GetFileName(f), Path = Path.GetFullPath(f) };
        Listbox.Items.Add(fileItem);
    }
}

private void Listbox_SelectedIndexChanged(object sender, EventArgs e)
{
    var selectedItems = ListBox1.SelectedItems.Cast<FileItem>();
    var all = string.Join(Environment.NewLine, selectedItems.Select(x => x.Path));
    MessageBox.Show(all);
}

2 个答案:

答案 0 :(得分:2)

问题:

在以下行中:

string selectedItems = Listbox.SelectedItems.ToString();

您所做的只是调用对象上的ToString。获取该对象的路径自然会为您提供C:\Users\...路径。

解决方案:

实现目标的一种方法是创建一个充当所需信息容器的类:

public class FileItem
{
    public string Title { get; set; }
    public string Path { get; set; }
}

然后,当您阅读文件夹时,在列表框中填写文件的路径和标题:

string[] files = Directory.GetFiles(@"C:\Temp", "*.txt", SearchOption.AllDirectories);

foreach (string f in files)
{
    var fileItem = new FileItem { Title = Path.GetFileName(f), Path = Path.GetFullPath(f) };
    listBox1.Items.Add(fileItem);
}

在表单的构造函数中,添加以下行:

listBox1.DisplayMember = "Title";
listBox1.ValueMember = "Path";

字符串值对应于FileItem类中的属性。在列表框的已更改事件中,将代码更改为以下内容:

var selectedItems = listBox1.SelectedItems.Cast<FileItem>();
var all = string.Join(Environment.NewLine, selectedItems.Select(x => x.Path));
MessageBox.Show(all);

这将创建一个字符串,其中包含在列表框中选择的文件的所有路径。

示例输出:

enter image description here

答案 1 :(得分:0)

如果仅提供文件名,则Path.GetFullPath方法返回当前目录路径:

  

此方法使用当前目录和当前卷信息   完全符合条件的路径。如果仅在路径中指定文件名,   GetFullPath返回当前目录的完全限定路径。

这就是为什么在Listbox_SelectedIndexChanged方法中返回当前目录路径的原因。

相反,您应该将文件的完整路径与列表框项目的文本分开保存,并使用Listbox_SelectedIndexChanged方法检索它:

// btnrecprefresh_Click method
string[] files = Directory.GetFiles(@"C:\test", "*.txt", SearchOption.AllDirectories);
foreach (string f in files)
{
    string entry = Path.GetFileName(f);
    var item = new ListBoxItem() { Content = entry, Tag = f };
    listbox.Items.Add(item);
}

// Listbox_SelectedIndexChanged method
var selectedItem = listbox.SelectedItem as ListBoxItem;
string path = selectedItem.Tag.ToString();
MessageBox.Show(path);