Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
100 / 95 / 23
Регистрация: 30.08.2015
Сообщений: 457

Поиск на диске, исключая определенные папки

23.02.2016, 23:28. Показов 1961. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго форумчане! программка ищет на всем диске файлы по маскам "*.xmcd" "*.dfr" "*.mcd"
для ускорения поиска исключил системные папки и поиск через winapi (тк быстрее ищет)
поиск начинается сразу при запуске программы
далее откуда он запустился создается папка "backup" и копируются туда все найденные файлы
на форме программы есть прогресс бар

решил частично - все что удалось нагуглить

VB.NET
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
53
54
55
56
Imports System.IO
Imports System.Collections.Concurrent
Imports System.Threading
Imports System.Threading.Tasks
 
Public list1 As New List(Of String) 'список папок в найденных и доступных дисков
Public  mask1 As String() = {"*.xmcd", "*.dfr", "*.mcd"}' маски
Public  filtr1 As String() = {"Windows", "Program Files", "RECYCLE", "System Volume Information"}' подстроки для исключения в списке папок для поиска
 
'функция поиска-------------------------------------------------------------------------
Public Function CollectFiles(ByVal directory As DirectoryInfo, ByVal pattern As String) As List(Of String)
        Dim queue As New ConcurrentQueue(Of String)()
        InternalCollectFiles(directory, pattern, queue)
        Return queue.AsEnumerable().ToList()
    End Function
 
    Public Sub InternalCollectFiles(ByVal directory As DirectoryInfo, ByVal pattern As String, ByVal queue As ConcurrentQueue(Of String))
        On Error Resume Next
        For Each result As String In directory.GetFiles(pattern).[Select](Function(file) file.FullName)
            queue.Enqueue(result)
        Next
        Task.WaitAll(directory.GetDirectories().[Select](Function(dir) Task.Factory.StartNew(Sub() InternalCollectFiles(dir, pattern, queue))).ToArray())
           End Sub
 
'запуск поиска -------------------------------------------------------------------------
Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim serch1 As New Thread(AddressOf ThreadProc)
       serch1.Start()
End Sub
 
Private Sub ThreadProc()
 For Each Drive As IO.DriveInfo In IO.DriveInfo.GetDrives
            If Drive.DriveType = IO.DriveType.Fixed Then
 
                If Drive.IsReady = True Then
 
                    On Error Resume Next
                    Dim directory1 As DirectoryInfo = New DirectoryInfo(Drive.Name)
 
                    Dim Dir() As String = IO.Directory.GetDirectories(Drive.Name)
                    For Each D As String In Dir
                        ListBox1.Items.Add(Drive.Name & IO.Path.GetFileName(D))
 
' не могу исключить из списка не нужные папки для поиска
 
 
                     'создание папки для копирования файлов
                      IO.Directory.CreateDirectory(Application.StartupPath.ToString & "backup")
 
          End If
            End If
        Next
Next
 
 
End Sub
заранее спс! и с праздником!!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.02.2016, 23:28
Ответы с готовыми решениями:

Поиск каталога, который содержит определенные папки
добрый вечер. нужно реализовать скрипт на баше, который на входе получает путь к каталогу, и список подкаталогов. ...

Поиск папки на диске
Здравствуйте! В общем, нашел в теме полезные батники скриптик - https://www.cyberforum.ru/cmd-bat/thread671391-page6.html#post4985723 ...

Конвертация из string в byte[], исключая определенные символы
Здравствуйте, как мне из string "\x70\x00\xA7\x1A\xCD" сделать byte = {0x70,0x00,0xA7,0x1A,0xCD} я сделал функцию, но она...

32
100 / 95 / 23
Регистрация: 30.08.2015
Сообщений: 457
24.02.2016, 23:57  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Winney Посмотреть сообщение
Или еще лучше. Создайте свой тип. Например
не получится функция CollectFiles(direc1, mask1(0)) работает только с List(Of String)
0
 Аватар для Winney
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
25.02.2016, 00:08
тьфу. зачем вы вообще заморочалиссь механизмами FIFO-LILO???

VB.NET
1
2
        Dim d As DirectoryInfo
        d.GetFiles()
Добавлено через 46 секунд

Не по теме:


Цитата Сообщение от densy Посмотреть сообщение
не получится функция CollectFiles(direc1, mask1(0)) работает только с List(Of String
ну и дура...

0
100 / 95 / 23
Регистрация: 30.08.2015
Сообщений: 457
25.02.2016, 00:10  [ТС]
Цитата Сообщение от Winney Посмотреть сообщение
зачем вы вообще заморочалиссь механизмами FIFO-LILO?
потому что это самый быстрый поиск файлов я писал что у меня время ограничено...
0
 Аватар для Winney
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
25.02.2016, 00:22
Цитата Сообщение от densy Посмотреть сообщение
потому что это самый быстрый поиск файлов я писал что у меня время ограничено...
Я это помню.
Вы сначала принципиально механизм отработайте.
А потом занимайтесь задачами оптимизации.
А сейчас у вас неизвестных слишком много, мне кажется (могу ошибаться, конечно же).

Добавлено через 8 минут
Цитата Сообщение от densy Посмотреть сообщение
работает только с List(Of String)
И мне кажется вы меня обманываете...
0
100 / 95 / 23
Регистрация: 30.08.2015
Сообщений: 457
25.02.2016, 00:40  [ТС]
Цитата Сообщение от Winney Посмотреть сообщение
И мне кажется вы меня обманываете...
какой смысл?)
0
 Аватар для Winney
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
25.02.2016, 01:00
Цитата Сообщение от densy Посмотреть сообщение
какой смысл?)
Я не буквально имел ввиду)))
По поводу
Цитата Сообщение от densy Посмотреть сообщение
потому что это самый быстрый поиск файлов
.
Может я что то недопонимаю... но в вашем коде используется GetFiles в 33-х обертках. Не понять...
Цитата Сообщение от Winney Посмотреть сообщение
быстрый поиск


Добавлено через 3 минуты
Цитата Сообщение от Winney Посмотреть сообщение
Я не буквально имел ввиду)))
Можно заморочаца и реализовать интерфейс нужный в пользовательском типе.
Но все же. Думаю, GetFiles проще. И понятнее)
0
100 / 95 / 23
Регистрация: 30.08.2015
Сообщений: 457
25.02.2016, 01:01  [ТС]
Winney, я его с этого сайта взял там вроде как тест проводили http://stackoverflow.com/quest... irectories

только там на C#
0
 Аватар для Winney
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
25.02.2016, 01:03
https://msdn.microsoft.com/ru-... yt2y8.aspx

Добавлено через 1 минуту
Поиск файлов по маске
0
100 / 95 / 23
Регистрация: 30.08.2015
Сообщений: 457
25.02.2016, 01:09  [ТС]
у меня затрачено около 20 сек на поиск 1800 файлов на 4 дисках при том что у меня адская структура кода))

Добавлено через 1 минуту
Winney, смотрел и пробывал как во второй ссылке - долго счет шел минутами
0
 Аватар для Winney
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
25.02.2016, 01:13
Цитата Сообщение от densy Посмотреть сообщение
там вроде как тест проводили
Да. Сравнение. Разница многопоточного варианта и GetFiles -- около 30%. Не катастрофа. Для первой иттерации)

Добавлено через 1 минуту
Цитата Сообщение от densy Посмотреть сообщение
у меня затрачено около 20 сек на поиск 1800 файлов
А сколько всего файлов было там??? 5000миллиардов? тогда 20 сек нормуль. А если 1801 - то конечно плохо(
0
100 / 95 / 23
Регистрация: 30.08.2015
Сообщений: 457
25.02.2016, 01:26  [ТС]
4 раздела на 1 терабайт почти полные все точно не знаю сколько всего файлов и в них он нашел 1800 файлов за 20 сек
0
 Аватар для vova2112
148 / 136 / 34
Регистрация: 28.02.2014
Сообщений: 165
25.02.2016, 16:56
densy, Можно воспользоваться такой конструкцией для исключения некоторых папок из поиска:
VB.NET
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
       Private Files As List(Of FileInfo)
 
    ''' Поиск файлов
    ''' </summary>
    ''' <param name="path">Директория поиска</param>
    ''' <param name="list">Коллекция (FileInfo)</param>
    ''' <param name="Subf">Поиск в подпапках</param>
    ''' <remarks></remarks>
    Public Sub GetFiles(ByRef path As String, ByRef list As List(Of FileInfo), ByRef Subf As Boolean)
        Dim stack As Stack(Of String) = New Stack(Of String)
        stack.Push(path)
        Do
            path = stack.Pop()
            Try
                If Subf Then
                    For Each folder In FileIO.FileSystem.GetDirectoryInfo(path).EnumerateDirectories
                        Select Case folder.Name
                            Case "Windows", "Program Files", "$RECYCLE.BIN", "System Volume Information"
                            Case Else
                                stack.Push(folder.FullName)
                        End Select
                    Next
                End If
                For Each file As FileInfo In FileIO.FileSystem.GetDirectoryInfo(path).EnumerateFiles()
                    Select Case file.Extension.ToLower
                        Case ".xmcd", ".dfr", ".mcd"
                            list.Add(file)
                    End Select
                Next
            Catch ex As Exception
            End Try
        Loop Until stack.Count = 0
    End Sub
 
Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Files = New List(Of FileInfo)
Dim serch1 As New Thread(AddressOf ThreadProc)
       serch1.Start()
End Sub
 
Private Sub ThreadProc()
 For Each Drive As IO.DriveInfo In IO.DriveInfo.GetDrives
            If Drive.DriveType = IO.DriveType.Fixed Then
                If Drive.IsReady = True Then
                    GetFiles1(DI.Name, Files, True)
          End If
            End If
Next
        For Each t In Files
            ListBox1.Items.Add(t.FullName)
        Next
End Sub
1
4709 / 3662 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
25.02.2016, 22:16
Как вариант можно попробовать использовать параллельный LINQ (PLINQ). Например, в таком виде
VB.NET
1
2
3
4
 Dim ff = (From dd In dr.AsParallel Select Directory.GetFiles(dd, "*.txt", SearchOption.TopDirectoryOnly)).ToArray
For Each ar As String() In ff
    ListBox1.Items.AddRange(ar)
Next
Здесь dr – список каталогов (массив)
Это может увеличить производительность (PLINQ пытается полностью использовать возможности всех процессоров в системе), но не всегда. Сам не проверял, но думаю, что попробовать стоит.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.02.2016, 22:16

Как получить пользователей из AD исключая определенные учетные записи из выдачи?
Добрый день! Хочу получить пользователей через Get-ADUser, но чтобы в выдаче не было определенных пользователей. Например хранить...

250 файлов *.pdf перенести с папки на диске в папки SharePoint
Всех приветствую! Уважаемые форумчане, нужна консультация в плане разработки для обычного пользователя настольного приложения для...

250 файлов *.pdf перенести с папки на диске в папки SharePoint
Всех приветствую! Уважаемые форумчане, нужна консультация в плане разработки для обычного пользователя настольного приложения для...

Как выбрать определенные файлы на жестком диске
как выбрать определенные файлы которые находятся на жестком диске?

Найти определенные папки в VS 2012
•Select Windows menu: Start/Programs/ Microsoft Visual Studio 2010/ Visual Studio Tools/ Visual Studio 2010 Command Prompt; •Copy from...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru