1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
1

Поиск по всем разделам диска

17.03.2018, 12:16. Показов 5238. Ответов 69
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Нашел код поиска файлов по названиям или форматам. Но почему он ищет только в системных папках?
Windows или Users, а по обычным ничего не выдаёт. Помогите разобраться)

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
       private void button9_Click(object sender, EventArgs e)
        {
            var results = MySearcher.GetFiles(@"C:\", "test|*.jpg");
            foreach (var result in results)
            {
                //Console.WriteLine(result.Name);
                richTextBox1.AppendText(result.FullName);
                richTextBox1.AppendText("\n");
                richTextBox1.Refresh();
            }
        }
 
        public static class MySearcher
        {
            private static readonly string[] Splitter = { "|" };
            public static IEnumerable<FileInfo> GetFiles(string path, string mask)
            {
                var maskArray = mask.Replace("*", ".+").Split(Splitter, StringSplitOptions.RemoveEmptyEntries).Select(x => "(" + x + ")");
                var pattern = string.Join("|", maskArray);
                var regex = new Regex(pattern);
 
                string[] entries;
                try
                {
                    entries = Directory.GetFileSystemEntries(path);
                }
                catch (UnauthorizedAccessException)
                {
                    yield break;
                }
                foreach (string entry in entries)
                {
                    var fi = new FileInfo(entry);
                    if (fi.Attributes.HasFlag(FileAttributes.Directory))
                        foreach (var fileInfo in GetFiles(entry, mask))
                        {
                            yield return fileInfo;
                        }
                    else if (regex.IsMatch(entry))
                        yield return fi;
                }
            }
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2018, 12:16
Ответы с готовыми решениями:

Как изменить и применить вид папок ко всем разделам и подразделам, в т.ч. и флешкам
Как изменить и применить вид папок КО ВСЕМ РАЗДЕЛАМ и подразделам, в т.ч. и во флешках и т.д. ...

Доступ пользователей у разделам жесткого диска!
Народ помогите плз! Такая ситуация с раздела D могу прочитать ин-цию а удалить, добавить или...

Какие права пользователей назначаются по-умолчания разделам жесткого диска после установки windows?
Здравствуйте. Какие права пользователей назначаются по-умолчания разделам жесткого диска после...

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

69
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
17.03.2018, 23:31  [ТС] 21
Author24 — интернет-сервис помощи студентам
VladPVS, что я только за это время не перепробовал) ничего не помогло) и ваш метод тоже) программа просто повисает(
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
17.03.2018, 23:33 22
Можно код?
1
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
17.03.2018, 23:34  [ТС] 23
Да конечно пожалуйста:
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using FastSearchLibrary;
 
namespace FastFoodDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SidePanel.Height = button1.Height;
            SidePanel.Top = button1.Top;
            this.MouseDown += new MouseEventHandler((o, e) =>
            {
                base.Capture = false;
                Message m = Message.Create(base.Handle, 0xA1, new IntPtr(2), IntPtr.Zero);
                this.WndProc(ref m);
            });
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            SidePanel.Height = button1.Height;
            SidePanel.Top = button1.Top;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            SidePanel.Height = button2.Height;
            SidePanel.Top = button2.Top;
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            SidePanel.Height = button3.Height;
            SidePanel.Top = button3.Top;
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            SidePanel.Height = button4.Height;
            SidePanel.Top = button4.Top;
        }
 
        private void mySecondCustmControl1_Load(object sender, EventArgs e)
        {
 
        }
 
        private void button8_Click(object sender, EventArgs e)
        {
 
        }
 
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
 
        }
 
        private void button13_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        private void label1_Click(object sender, EventArgs e)
        {
 
        }
 
        private void label1_Click_1(object sender, EventArgs e)
        {
 
        }
 
        private void SidePanel_Paint(object sender, PaintEventArgs e)
        {
 
        }
 
        private void button8_Click_1(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;
        }
 
        private void button9_Click(object sender, EventArgs e)
        {
            CancellationTokenSource tokenSource = new CancellationTokenSource();
 
            FileSearcher searcher = new FileSearcher(@"C:\", (f) => Regex.IsMatch(f.Name, @"Cheat"), tokenSource);
 
            List<FileInfo> files = new List<FileInfo>(); // список результатов
 
            object locker = new object();
            searcher.FilesFound += (sndr, arg) =>
            {
                lock (locker)
                {
                    Invoke((Action)(() =>
                    {
                        arg.Files.ForEach((f) =>
                        {
                            files.Add(f);
                            richTextBox1.AppendText($"Расположение: {f.FullName}, \nДата создания: {f.CreationTime}");
                        });
                    }));
 
                    if (files.Count >= 10)
                        searcher.StopSearch(); // останавливаем поиск досрочно
                }
            };
 
            searcher.SearchCompleted += (sndr, arg) =>
            {
                if (arg.IsCanceled)
                    MessageBox.Show("Search stopped.");
                    //richTextBox1.AppendText("Поиск остановлен");
                else
                    MessageBox.Show("Search completed.");
                    //richTextBox1.AppendText("Поиск завершён");
 
                MessageBox.Show($"Quantity of files: {files.Count}");
                //richTextBox1.AppendText($"Найдено файлов: {files.Count}");
            };
 
            var task = searcher.StartSearchAsync();
 
            task.Wait();
        }
 
        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
 
        }
    }
}
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
17.03.2018, 23:37 24
Так конечно, task.Wait(); нельзя в графическом приложении использовать, он вызовет взаимную блокировку.

C#
1
2
3
            var task = searcher.StartSearchAsync();
 
            task.Wait();
Нужно заменить на:
C#
1
 searcher.StartSearchAsync();
1
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
17.03.2018, 23:40  [ТС] 25
VladPVS, я вам очень благодарен) все прекрасно работает, ваш код супер!
Спасибо Вам большое)
Теперь все ищет почти моментально и без косяков)
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
17.03.2018, 23:45 26

Не по теме:

Надеюсь так скажут на собеседовании на Junior'а.



А как по скорости и корректности работы?
0
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
17.03.2018, 23:49  [ТС] 27
VladPVS, 1000 строчек примерно за 3 секунды.
Все корректно) Ввел поиск .*jpg - нашел именно их.
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
18.03.2018, 00:04 28
Процессор мощный, диск SSD?

Добавлено через 8 минут
У меня i7 1.6 Ghz первого поколения и диск SSD, прирост скорости по сравнению с однопоточным методом составляет раза в 2.5-3, зависит от текущей загруженности процессора. Вообще, желательно перед запуском позакрывать ресурсоёмкие приложения, тогда поиск работает немного быстрее.
0
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
18.03.2018, 00:28  [ТС] 29
i5-2400)
да SSD
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
18.03.2018, 00:37 30
Ну да, достаточно мощный процессор, такая производительность достигается именно благодаря параллельности, если бы был какой-нибудь одноядерный Celeron - преимущество многопоточности было б минимальное.
Я рад, что удалось помочь, если будут вопросы или замечания по работе - пишите.
0
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
18.03.2018, 00:45  [ТС] 31
Уже возник)
Не могу на другую кнопку сделать СТОП)
Код
searcher.StopSearch();
Естественно нет такого контекста в данном методе)
Как его вызвать для другой кнопки?)
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
18.03.2018, 00:50 32
Что именно не получается? Какие-ошибки появляются?

Добавлено через 1 минуту
Скорее всего нужно searcher вынести на уровень класса:
C#
1
private FileSearcher searcher;
Добавлено через 1 минуту
Поиск, кстати, останавливаться будет далеко не всегда мгновенно, иногда для этого может потребоваться несколько секунд - не так и просто отменить множество задач.
0
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
18.03.2018, 00:53  [ТС] 33
Пару секунд это ничего страшного, эта кнопка нужна, как не крути)
C#
1
2
3
System.NullReferenceException: "Ссылка на объект не указывает на экземпляр объекта."
 
searcher было null.
Хм странно, почему null.
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
18.03.2018, 00:55 34
Где именно? Не пойму.
0
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
18.03.2018, 00:56  [ТС] 35
C#
1
2
3
4
5
6
        private FileSearcher searcher;
        private void button7_Click(object sender, EventArgs e)
        {
            button9.Visible = true;
            searcher.StopSearch();
        }
searcher.StopSearch(); - выдает ошибку
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
18.03.2018, 01:00 36
C#
1
FileSearcher searcher = new FileSearcher(@"C:\", (f) => Regex.IsMatch(f.Name, @"Cheat"), tokenSource);
нужно заменить на следующую строку (одну)

C#
1
 searcher = new FileSearcher(@"C:\", (f) => Regex.IsMatch(f.Name, @"Cheat"), tokenSource);
C#
1
private FileSearcher searcher; // searcher ведь не инициализируется, потому равен null

Советую всё-таки почитать книги по C#, если эта деятельность будет в дальнейшем профессией.
1
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
18.03.2018, 01:14  [ТС] 37
VladPVS, это точно)
но профессия у меня в другом немного русле - C# скорее хобби домашнее, отвлекаюсь от работы)

Да, все заработало без проблем)

Добавлено через 4 минуты
VladPVS, Спасибо еще раз за помощь) Завтра меня ждет новая функция моей проги) а там еще ужасней всё)
Добавлю Ваш ник в список разработчиков (при поддержке)
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
18.03.2018, 01:22 38
Ну хорошо, что заработало. А у меня пока тоже хобби, а нужно, чтобы было профессией.

Не по теме:


Но как глянуть требования, не понятно, точно ли Junior'ов ищут, а не Senior'ов?


Так что если будут замечания по поводу поиска, может некорректная работа или ещё что-то - пишите, буду смотреть, модифицировать, если что.

Добавлено через 5 минут
Если посмотреть лицензию Mozilla Public License 2.0, под которой распространяется библиотека, то там ещё и не такие требования есть.
Хотя меня всё-равно никто не знает.
Но если вдруг программа принесёт прибыль, то я вполне готов принять её часть.
1
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
18.03.2018, 13:40  [ТС] 39
А у вашей библиотеки предусмотрен прогрессбар?)

Добавлено через 53 минуты
Что я делаю не так в этой жизни)
Прогрессбар просто газ в пол и в конец, хотя поиск еще идёт)

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
progressBar1.Value = 0;
CancellationTokenSource tokenSource = new CancellationTokenSource();
 
            searcher = new FileSearcher(@"C:\", (f) => Regex.IsMatch(f.Name, @".*txt"), tokenSource);
 
            List<FileInfo> files = new List<FileInfo>(); // список результатов
            
            object locker = new object();
            searcher.FilesFound += (sndr, arg) =>
            {
                lock (locker)
                {
                    Invoke((Action)(() =>
                    {
                        arg.Files.ForEach((f) =>
                        {
                            files.Add(f);
                            progressBar1.Maximum = files.Count;
                            progressBar1.Increment(1);
                            richTextBox1.AppendText($"{f.FullName}" + Environment.NewLine);
                            richTextBox1.SelectionStart = richTextBox1.Text.Length;
                            richTextBox1.ScrollToCaret();
                            //richTextBox1.AppendText($"Расположение: {f.FullName}, \nДата создания: {f.CreationTime}");
                        });
                    }));
 
                    if (files.Count >= 1000)
                        searcher.StopSearch(); // останавливаем поиск досрочно
                    if (progressBar1.Value == progressBar1.Maximum)
                    {
                        //
                    }
                }
            };
Добавлено через 1 час 20 минут
В очередной раз столкнулся с кучей неприятных ситуаций и интернет мне не помог)
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
        private void button9_Click(object sender, EventArgs e)
        {
            button9.Visible = false;
            button7.Visible = true;
            //progressBar1.Value = 0;
 
            DriveInfo[] allDrives = DriveInfo.GetDrives();
 
            foreach (DriveInfo d in allDrives)
            {
                CancellationTokenSource tokenSource = new CancellationTokenSource();
                searcher = new FileSearcher(@"C:\", (f) => Regex.IsMatch(f.Name, @".*txt"), tokenSource);
 
                List<FileInfo> files = new List<FileInfo>(); // список результатов
 
                object locker = new object();
                searcher.FilesFound += (sndr, arg) =>
                {
                    lock (locker)
                    {
                        Invoke((Action)(() =>
                        {
                            arg.Files.ForEach((f) =>
                            {
                                files.Add(f);
                                //progressBar1.Maximum = files.Count;
                                richTextBox1.AppendText($"{f.FullName}" + Environment.NewLine);
                                richTextBox1.SelectionStart = richTextBox1.Text.Length;
                                richTextBox1.ScrollToCaret();
                                //progressBar1.Increment(1);
                                //richTextBox1.AppendText($"Расположение: {f.FullName}, \nДата создания: {f.CreationTime}");
                            });
                        }));
 
                    //if (files.Count >= 1000)
                    //searcher.StopSearch(); // останавливаем поиск досрочно
 
                        if (progressBar1.Value == progressBar1.Maximum)
                        {
                            //
                        }
                    }
                };
 
                searcher.SearchCompleted += (sndr, arg) =>
                {
                    Invoke((Action)(() =>
                    {
                        if (arg.IsCanceled)
                        {
                            richTextBox1.AppendText($"Поиск остановлен" + Environment.NewLine);
                            richTextBox1.SelectionStart = richTextBox1.Text.Length;
                            richTextBox1.ScrollToCaret();
                        //richTextBox1.AppendText("Поиск остановлен");
                    }
                        else
                        {
                            richTextBox1.AppendText(Environment.NewLine);
                            richTextBox1.AppendText($"Поиск завершён" + Environment.NewLine);
                            richTextBox1.SelectionStart = richTextBox1.Text.Length;
                            richTextBox1.ScrollToCaret();
                            button9.Visible = true;
                            button7.Visible = false;
                        //richTextBox1.AppendText("Поиск завершён");
                    }
                        richTextBox1.AppendText($"Найдено подозрительных файлов: {files.Count}" + Environment.NewLine);
                        richTextBox1.SelectionStart = richTextBox1.Text.Length;
                        richTextBox1.ScrollToCaret();
                    //richTextBox1.AppendText($"Найдено файлов: {files.Count}");
                }));
                };
            }
            searcher.StartSearchAsync();
        }
1. Попытался сделать поиск на всех дисках через
foreach (DriveInfo d in allDrives)
Но
searcher = new FileSearcher(d.Name, (f) => Regex.IsMatch(f.Name, @".*txt"), tokenSource);
Выдает ошибки... Не получается заменить на все диски.

2. Попытался сделать как Вы мне посоветовали Выше поиск нескольких ключевых слов
C#
1
2
3
4
5
6
7
8
9
 List<String> patterns = new List<string>() { "file1", "file2", "file3", "file4", "file5" };
 
            List<FileInfo> resultFiles = FileSearcher.GetFilesFast(@"C:\", (f) =>
            {
                foreach (var p in patterns)
                    if (f.Name.Contains(p))
                        return true;
                return false;
            });
программа повисает с концами... и нет ошибок никаких(

3. Прогресс Бар работает не верно, каждый раз меняя Maximum (заранее то нельзя узнать, какой будет максимум, это дураку понятно, т.к. поиск идет в реальном времени) и постоянно дергается в самом конце.

Люди добрые подайте знаний
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
18.03.2018, 14:45 40
ProgressBar нужно к чему-то привязывать, чтобы знать сколько процентов работы выполнено, а тут к чему привязать?
Алгоритм то нелинейный, да ещё и многопоточный, можно только сделать движущийся ProgressBar.
Цитата Сообщение от XhonoRjke Посмотреть сообщение
1. Попытался сделать поиск на всех дисках через
foreach (DriveInfo d in allDrives)
Можно попробовать создать несколько задач параллельно, но тогда возникнут сложности с отслеживанием завершения, так как каждая будет сообщать о своём завершении. Либо же можно запускать последовательно и в обработчике события завершения предыдущего поиска запускать следующий.

Какие ключевые слова нужно найти?
1
18.03.2018, 14:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2018, 14:45
Помогаю со студенческими работами здесь

Как обойти поиск по разделам?
Здравствуйте скажите пожалуйста как обойти поиск по разделам ?? изначально дет выборка по...

Не могу разобраться с PostgreSQL. Поиск по всем таблицам и всем полям?
Вообщем у меня следующая проблема... подскажите как сделать поиск по во всех таблицах базы и во...

Поиск по всем полям
Здравствуйте. Раньше вел базу таблицу в excel, но сейчас хочу перейти на Access, т.к. думаю больше...

Поиск по всем запросам
Уважаемые Гуру, подскажите можно или нет организовать поиск поля по всем запросам бд. Если можно,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru