Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437

Как получить путь к файлу из ListView

27.07.2024, 19:26. Показов 1443. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, я получаю из определенной директории список файлов в ListView и при нажатии на один из этих файлов хочу получить путь к этому файлу как правильно это реализовать? Если можно с примером. За ранее всем спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.07.2024, 19:26
Ответы с готовыми решениями:

Получить путь к выбранному файлу в ListView
Есть ListViev который отображает список файлов в данной папке. Есть richTextBox1 в который нужно отобразить полный путь к выбранному...

Как программно получить путь к файлу конфигураций программы (файлу user.config)?
Задался целью программно очистить параметры программы, которые сохраняются в файле user.config. Так как параметров много, чтобы очистить...

Как получить путь к файлу?
Ребят, как получить путь к файл, зная его полный путь. Т.е. я имею строку: "c:\\directory\file.txt" А надо...

21
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3430 / 2749 / 575
Регистрация: 04.09.2018
Сообщений: 8,628
Записей в блоге: 3
27.07.2024, 21:19
Цитата Сообщение от pafka1997 Посмотреть сообщение
я получаю из определенной директории список файлов
есть код этого?
Цитата Сообщение от pafka1997 Посмотреть сообщение
хочу получить путь к этому файлу
куда получить?
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
27.07.2024, 21:19  [ТС]
wizard41,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 string aaa = (@"C:\Windows\Prefetch");
            listView1.Items.Clear();
 
            foreach (string file in Directory.GetFiles(aaa))
            {
                ListViewItem item1 = new ListViewItem(Path.GetFileName(file));
                item1.SubItems.Add((Math.Round(new FileInfo(file).Length / 1024.0, 2)).ToString());
 
                Win32API.SHFILEINFO info = new Win32API.SHFILEINFO();
                uint dwFileAttributes = Win32API.FILE_ATTRIBUTE.FILE_ATTRIBUTE_NORMAL;
                uint uFlags = (uint)(Win32API.SHGFI.SHGFI_TYPENAME | Win32API.SHGFI.SHGFI_USEFILEATTRIBUTES);
                Win32API.SHGetFileInfo(file, dwFileAttributes, ref info, (uint)Marshal.SizeOf(info), uFlags);
 
                item1.SubItems.Add(info.szTypeName);
                item1.Checked = true;
 
                listView1.Items.Add(item1);
            }
 
            for (int i = 0; i < listView1.Columns.Count; i++)
                listView1.AutoResizeColumn(i, ColumnHeaderAutoResizeStyle.ColumnContent);
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
27.07.2024, 21:24  [ТС]
wizard41,
Цитата Сообщение от wizard41 Посмотреть сообщение
куда получить?
Вот смотри я получаю список файлов из папки Prefetch

и при двойном нажатии на любой файл из списка получить путь к этому файлу "хоть в MessageBox хоть в string не важно"

Сразу отвечу на вопрос почему не указать путь сразу "Потому что в данном листе будет множество разных путей"
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3430 / 2749 / 575
Регистрация: 04.09.2018
Сообщений: 8,628
Записей в блоге: 3
27.07.2024, 23:08
pafka1997,
Вложения
Тип файла: 7z WindowsFormsApp2.7z (6.4 Кб, 12 просмотров)
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
27.07.2024, 23:45
Лучший ответ Сообщение было отмечено pafka1997 как решение

Решение

pafka1997, простое решение это занести полный путь к файлу в свойство Tag.
C#
4
5
6
7
            foreach (string file in Directory.GetFiles(aaa))
            {
                ListViewItem item1 = new ListViewItem(Path.GetFileName(file));
                item1.Tag = file;
Тогда путь выбранного элемента можно будет получить так:
C#
1
string fullPath = (string)listView1.SelectedItems[0].Tag;
wizard41, ваше решение сломается если разрешить сортировку файлов внутри ListView. Еще я вижу вы заменили вызов Windows API функции SHGetFileInfo на $"Файл "{file.Extension.ToUpper()}"". Но это видимо только чтобы не тратить зря время на воспроизведение кода ТСа.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3430 / 2749 / 575
Регистрация: 04.09.2018
Сообщений: 8,628
Записей в блоге: 3
27.07.2024, 23:55
Цитата Сообщение от OwenGlendower Посмотреть сообщение
видимо только чтобы не тратить зря время на воспроизведение кода ТСа
точно так. С остальным, думаю разберется сам.
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
28.07.2024, 00:14  [ТС]
wizard41, Пример хороший, но не подходит. Через Textbox я понимаю как это реализовать, но у меня нету Textbox нету не кнопок, не текстбоксов и т.д у меня только listview и событие MouseDoubleClick

Добавлено через 8 минут
wizard41, Извиняюсь, уже сплю. Почему сам про это не подумал не знаю, все сделал спасибо.
Единственное выводит исключение при втором нажатии на список
System.ArgumentOutOfRangeException: "InvalidArgument=Значение '0' недопустимо для 'index'.
Имя параметра: index

в строке
C#
1
2
 private void listView1_SelectedIndexChanged(object sender, EventArgs e) =>
            MessageBox.Show(fileInfoList[listView1.SelectedIndices[0]].FullName);
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3430 / 2749 / 575
Регистрация: 04.09.2018
Сообщений: 8,628
Записей в блоге: 3
28.07.2024, 11:45
Цитата Сообщение от pafka1997 Посмотреть сообщение
Единственное выводит исключение при втором нажатии на список
System.ArgumentOutOfRangeException: "InvalidArgument=Значение '0' недопустимо для 'index'.
Это происходит при клике на пустом месте. Для исправления можно заменить событие SelectedIndexChanged на Click:
C#
1
2
private void listView1_Click(object sender, EventArgs e) =>
    MessageBox.Show((string) listView1.SelectedItems[0].Tag);
Так же надо иметь в виду, что listView поддерживает мульти-выбор - его нужно отключить в свойствах элемента.
Да, и зачем тут подключать Win32Api, если все необходимое можно взять из класса FileInfo..?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
28.07.2024, 14:19
Цитата Сообщение от wizard41 Посмотреть сообщение
Да, и зачем тут подключать Win32Api, если все необходимое можно взять из класса FileInfo..?
Как раз то что получает ТС - тип файла - через FileInfo нет возможности получить.
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
28.07.2024, 16:06  [ТС]
wizard41,
Цитата Сообщение от wizard41 Посмотреть сообщение
Это происходит при клике на пустом месте. Для исправления можно заменить событие SelectedIndexChanged на Click:
Да, почти так и сделал

Такой вопрос еще назрел, а возможно ли из нескольких директорий загрузить список файлов в listview и как правильно это сделать, пока сам читаю статьи и ищу информацию
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
28.07.2024, 18:54
Цитата Сообщение от pafka1997 Посмотреть сообщение
а возможно ли из нескольких директорий загрузить список файлов в listview и как правильно это сделать
Конечно можно. Если речь о каталогах внутри одного каталога, то такой код вернет все файлы из текущего каталога и из всех вложенных
C#
1
Directory.GetFiles(aaa, "*", SearchOption.AllDirectories)
Если речь о независимых каталогах, то просто вызывайте Directory.GetFiles для каждого каталога.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3430 / 2749 / 575
Регистрация: 04.09.2018
Сообщений: 8,628
Записей в блоге: 3
29.07.2024, 03:04
Цитата Сообщение от pafka1997 Посмотреть сообщение
а возможно ли из нескольких директорий загрузить список файлов в listview и как правильно это сделать
Многое возможно, особенно когда есть понимание того что делаешь. Пока эти вопросы выглядят как "частные случаи", но если озвучить мысль в общем - что необходимо получить в итоге, тогда, возможно, подскажут более оптимальные пути решения.
ListView весьма тяжелый элемент, довольно громоздкое управление им, особенно в винФормах. Обычно, я делал свой класс листвью, отнаследованный от базового со всем необходимым функционалом. Но применял его крайне редко - такого рода данные неплохо собираются в DataGrid'ах.

Цитата Сообщение от OwenGlendower Посмотреть сообщение
Как раз то что получает ТС - тип файла - через FileInfo нет возможности получить.
Да я что-т подумал про расширение файла. А то что тип да, так не выйдет.

Цитата Сообщение от OwenGlendower Посмотреть сообщение
ваше решение сломается если разрешить сортировку файлов внутри ListView.
только обратил внимание - не заметил сразу ). Конечно, тут полная рассинхронизация произойдет между списком и коллекцией внутри листвью. Но я об этом, вроде как, и не думал вовсе, отвечая на вопрос "как достать путь из листвью по щелчку".
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
29.07.2024, 10:09  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Если речь о независимых каталогах, то просто вызывайте Directory.GetFiles для каждого каталога.
Как вы сказали, я перебираю Directory.GetFiles для каждого каталога который мне нужен и все работает, но теперь я не понимаю как правильно сделать.
У меня при событии Click происходить открытие каталога Prefetch из листа fileInfoListPrefetch, а если у меня в listview добавляется список файлов из папки Temp то как открыть каждую папку по отдельности если нажимать в листе на файл из папки Prefetch он открывает эту папку, а если нажимаем на файл из папки Temp он откроет папку Temp

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
readonly string pathPrefetch = @"C:\Windows\Prefetch";
        readonly string pathTemp = Path.GetTempPath();
        readonly List<FileInfo> fileInfoListPrefetch = new List<FileInfo>();
        readonly List<FileInfo> fileInfoListTemp = new List<FileInfo>();
        
        private void listView1_Click(object sender, EventArgs e)
        {
            try
            {
 
                Process.Start(fileInfoListPrefetch[listView1.SelectedIndices[0]].DirectoryName);
            }
            catch { } 
        }
        void listViewUpdate()
        {
            var filesPrefetch = Directory.GetFiles(pathPrefetch);
            var filesTemp = Directory.GetFiles(pathTemp);
            listView1.Items.Clear();
            fileInfoListPrefetch.Clear();
            fileInfoListTemp.Clear();
            fileInfoListPrefetch.AddRange(filesPrefetch.Select(f => new FileInfo(f)).ToArray());
            fileInfoListTemp.AddRange(filesTemp.Select(f => new FileInfo(f)).ToArray());
 
            foreach (var filePrefetch in fileInfoListPrefetch)
            {
                ListViewItem item = new ListViewItem(filePrefetch.Name);
                item.SubItems.Add(Math.Round(filePrefetch.Length / 1024.0, 2).ToString());
                item.SubItems.Add($"Файл \"{filePrefetch.Extension.ToUpper()}\"");
                listView1.Items.Add(item);
            }
            foreach (var filetemp in fileInfoListTemp)
            {
                ListViewItem item = new ListViewItem(filetemp.Name);
                item.SubItems.Add(Math.Round(filetemp.Length / 1024.0, 2).ToString());
                item.SubItems.Add($"Файл \"{filetemp.Extension.ToUpper()}\"");
                listView1.Items.Add(item);
            }
 
            listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
        }
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,748
Записей в блоге: 1
29.07.2024, 11:05
pafka1997, не мучайтесь вы с этим ListView, перейдите на DataGridView. Я пробовал реализовать привязку данных к ListView вот тут и она вроде бы работает, но возможны нюансы.
При работе с элементом управления (ЭУ) и по аналогии механизмов привязки данных следует использовать только одну коллекцию с одним ЭУ, а у вас их две, вот вы и путаетесь.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
29.07.2024, 11:31
Цитата Сообщение от pafka1997 Посмотреть сообщение
но теперь я не понимаю как правильно сделать.
Используйте свойство Tag, о котором я уже писал выше. Решение wizard41 можно модифицировать для поддержки разных каталогов, но с Tag это проще.
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
29.07.2024, 11:32  [ТС]
OwenGlendower, попробую, как найду решение выложу сюда
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
29.07.2024, 11:39
pafka1997, что значит "найду решение"? Вам уже выложили решение. Что именно вы собираетесь искать?
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
29.07.2024, 12:47  [ТС]
OwenGlendower, Решение.

Всем большое спасибо

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public partial class Form1 : Form
    {
        readonly string defaultPath = @"C:\Windows\Prefetch";
        readonly string defaultPath1 = Path.GetTempPath();
        readonly List<FileInfo> fileInfoList = new List<FileInfo>();
 
        public Form1()
        {
            InitializeComponent();
            listViewUpdate();
        }
 
 
        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                string fullPath = (string)listView1.SelectedItems[0].Tag;
 
                fullPath = fullPath.Remove(fullPath.LastIndexOf("\\"));
                Process.Start(fullPath);
            }
            catch { }
        }
 
 
        void listViewUpdate()
        {
 
            foreach (string file in Directory.GetFiles(defaultPath1))
            {
                ListViewItem item1 = new ListViewItem(Path.GetFileName(file));
                item1.SubItems.Add(Math.Round(file.Length / 1024.0, 2).ToString());
                listView1.Items.Add(item1);
                item1.Tag = file;
            }
 
            foreach (string file in Directory.GetFiles(defaultPath))
            {
                ListViewItem item1 = new ListViewItem(Path.GetFileName(file));
                item1.SubItems.Add(Math.Round(file.Length / 1024.0, 2).ToString());
                listView1.Items.Add(item1);
                item1.Tag = file;
            }
        }
    }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
29.07.2024, 13:18
Лучший ответ Сообщение было отмечено pafka1997 как решение

Решение

pafka1997, вот так лучше (читайте комментарии)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public partial class Form1 : Form
{
    readonly string defaultPath = @"C:\Windows\Prefetch";
    readonly string defaultPath1 = Path.GetTempPath();
 
    public Form1()
    {
        InitializeComponent();
        listViewUpdate();
    }
 
 
    private void listView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        // if лучше чем try/catch
        if (listView1.SelectedItems.Count == 0) return;
        
        string fullPath = (string)listView1.SelectedItems[0].Tag;
        fullPath = Path.GetDirectoryName(fullPath); // Это лучше чем Sustring т.к. ясно обозначает намерение
        Process.Start(fullPath);
    }
 
 
    void listViewUpdate()
    {
        // Массовое обновление ListView лучше выполнять внутри BeginUpdate/EndUpdate блока чтобы отложить перерисовку до окончания обновления
        listView1.BeginUpdate();
        try
        {
            AddFiles(defaultPath1);
            AddFiles(defaultPath);
        }
        finally
        {
            listView1.EndUpdate();
        }
    }
 
    // Повторяющийся код следует выносить в отдельный метод
    void AddFiles(string directory)
    {
        foreach (string fullPath in Directory.GetFiles(directory))
        {
            ListViewItem listViewItem = new ListViewItem(Path.GetFileName(fullPath))
            {
                Tag = fullPath
            };
            listViewItem.SubItems.Add(Math.Round(fullPath.Length / 1024.0, 2).ToString());
            listView1.Items.Add(listViewItem);
        }
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.07.2024, 13:18
Помогаю со студенческими работами здесь

Как получить путь к файлу
Здороф народ. Есть такая проблемка. Имеется простая HTML форма. Необходимо по нажатию кнопки, показать окно с выбором файлов. После выбора...

Как получить путь к файлу?
С праздниками! Собственно вопрос темы в ее названии. Возможно ли это в PS 2.0? В Сети встречал много подобных вариантов, но именно моего...

Как получить путь к файлу?
У меня есть некоторый файл, который находится в некоторой папке. Как с помощью C# получить его путь? Например:...

Как получить путь к файлу
Есть проект &quot;IMorseCode&quot;, в нём есть пакет &quot;mainPackage&quot;, где находятся классы. Есть пакет &quot;txt&quot;, в котором находится...

Как получить полный путь к файлу?
Всем здравия и благополучия! Помогите пожлуйста разобраться с jquery которая была применина к &lt;input type=&quot;file&quot;/&gt;, ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru