Member 13612896 Ответов: 4

Есть ли более быстрый способ перечислить папки и файлы, чем enumeratefiles?


I have a list of directories (121) that I want to generate all the files inside of them including sub directories. There are about 7300 files and folders inside the original list. EnumerateFiles and GetFiles take forever to populate the list. (8 minutes) I have done a comparison of a cmd line "Dir /s" and the "enumeratefiles" for one of the largest directories. "enumeratefiles" takes about 35 seconds, and "Dir /s" takes 2 seconds. I am just looking for a list of files and folders with their complete path name such as what you get from the cmd line "Dir /s". Is there a faster method for me to get this list? I have been trying the VB "Dir(filename)" but cannot seem to get this to work. The original list of files is coming from an array that I have previously populated. I'm new at this so I am probably not using good coding practices. :/

Что я уже пробовал:

Для каждого имени файла в виде строки в IO.Каталог.EnumerateFiles("o:\tapes\maxim500\dnc", "*", IO.SearchOption.AllDirectories)

Если TextBox1.Text = "", То
Текстовое поле textbox1.Текст = именем
Еще
Текстовое поле textbox1.Текст = Элемент Textbox1.Текст &амп; vbNewLine &амп; именем
Конец, Если


Следующий

4 Ответов

Рейтинг:
25

Graeme_Grant

Я не совсем понимаю, почему вы хотите отображать так много информации в текстовом поле. Добавление в текстовое поле-это очень медленный и ресурсоемкий способ сделать это. Вместо этого вам следует использовать StringBuilder.

Лучшим методом, только немного быстрее, является использование списка. Это также дает вам возможность выбирать элементы.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim sb As StringBuilder = New StringBuilder()

    For Each filename As String In IO.Directory.EnumerateFiles("o:\tapes\maxim500\dnc", "*", IO.SearchOption.AllDirectories)
        sb.AppendLine(filename)
    Next

    TextBox1.Text = sb.ToString()

End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    ListBox1.DataSource = IO.Directory.EnumerateFiles("o:\tapes\maxim500\dnc", "*", IO.SearchOption.AllDirectories).ToList
End Sub


Самый быстрый способ сделать это-использовать TreeView и ленивую загрузку по требованию расширяемой папки.


Рейтинг:
2

phil.o

Вы постоянно объединяете строки, Что может объяснить плохую производительность, которую вы получаете.
Вы должны использовать StringBuilder для построения строки и присвоить ее свойству text в конце.

Dim sb As new System.Text.StringBuilder(500000)
For Each filename As String In IO.Directory.EnumerateFiles("o:\tapes\maxim500\dnc", "*", IO.SearchOption.AllDirectories)
   sb.AppendLine(filename)
Next
TextBox1.Text = sb.ToString()

Надеюсь, это поможет.


Рейтинг:
1

Jochen Arndt

Вы обновляете текстовое поле, добавляя каждое имя файла. Это занимает много времени, потому что для каждого имени файла содержимое текстового поля должно быть обновлено и перерисовано.

Вы можете добавить имена к a StringBuilder вместо переменной (что быстрее, чем при использовании String) и назначьте это текстовому полю после того, как все имена будут определены:

Dim listOfNames As New StringBuilder
For Each filename As String In IO.Directory.EnumerateFiles("o:\tapes\maxim500\dnc", "*", IO.SearchOption.AllDirectories)
    If listOfNames.Length > 0 Then
        listOfNames.AppendLine()
    End If
    listOfNames.Append(filename)
Next
TextBox1.Text = listOfNames.ToString()

Если вы хотите, чтобы текстовое поле периодически обновлялось во время перечисления, добавьте переменную счетчика и обновите текстовое поле, когда оно пересекает границу (это можно сделать с помощью Mod оператор).


Рейтинг:
1

F. Xaver

Как уже упоминалось в других ответах, эта конкатенация строк и постоянное перерисовывание - ваша проблема.
но зачем вообще перечислять, просто чтобы объединить или добавить свои элементы.

Если вы действительно хотите отобразить его в текстовом поле, этот один лайнер должен работать одинаково быстро.

TextBox1.Text = String.Join(Environment.NewLine, IO.Directory.GetFiles("o:\tapes\maxim500\dnc", "*", IO.SearchOption.AllDirectories))
(Я думаю, что это плохое дизайнерское решение)


Если у вас действительно есть как 7 тысяч входов..
Я бы предпочел что-то вроде Graeme_Grant как уже упоминалось, TreeView открывает только необходимые подпапки или ListView в VirtualMode .. maybee оба смешиваются, в зависимости от того, сколько файлов находится в одной подпапке

работа с этим 7k - строчным текстовым полем ... кто, черт возьми, будет делать что-то с этим^^, например, искать ту единственную запись, которая вам нужна.