Получить адрес файла из ListBox

В listBox необходимо по нажатию на кнопку "Принять" записать путь к файлу в переменную. В окне отображаются реальные файлы из папки(без расширений).

введите сюда описание изображения

DirectoryInfo dir = new DirectoryInfo(@"C:\Users\Desktop");
            FileInfo[] files = dir.GetFiles("*.txt");

 var fileNamesWithoutExtension = files
                .Select(fi => Path.GetFileNameWithoutExtension(fi.Name));
            foreach (string fn in fileNamesWithoutExtension)
            {
                listBox1.Items.Add(fn.ToString());
            }

Ответы (1 шт):

Автор решения: Alexander Petrov

Вам нужны два значения: имя файла без расширения (которое будет показываться в листбоксе) и полный путь (по которому можно получить доступ к файлу).

Создадим модель для этих значений:

class FileModel
{
    public string FullName { get; set; }
    public string NameWithoutExtension { get; set; }
}

Теперь создадим список этих моделей и привяжем его к листбоксу:

var fileModels = files
    .Select(fi => new FileModel
    {
        FullName = fi.FullName,
        NameWithoutExtension = Path.GetFileNameWithoutExtension(fi.Name)
    })
    .ToList();

listBox.DisplayMember = nameof(FileModel.NameWithoutExtension);
listBox.ValueMember = nameof(FileModel.FullName);
listBox.DataSource = fileModels;

В свойстве DisplayMember задаём то свойство, которое будет показываться пользователю.
В свойстве ValueMember задаём то свойство, которое потом будем получать.

Теперь можно получать путь. Например, в событии:

private void ListBox_SelectedValueChanged(object sender, EventArgs e)
{
    string filename = (string)listBox.SelectedValue;
    // Используем filename как нам нужно.
    Text = filename;
}

Если бы у класса FileInfo было свойство, содержащее имя без расширения, то можно было бы использовать его, не создавая класс FileModel. Но так как такого свойства нет, пришлось ввести дополнительный класс. Впрочем, использование моделей в любом случае считается правильным подходом.

→ Ссылка