Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 12.07.2016
Сообщений: 24
1

Поиск файлов по нескольким разделам

14.07.2016, 12:59. Показов 1458. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста переделать код, чтобы поиск был по нескольким разделам с несколькими расширениями. Т.е. искало на диске A, B, C по расширению jpg, png, bmp, jpeg.

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
class Program
    {
        static void Main(string[] args)
        {
 
            IEnumerable<string> MyFiles = SafeEnumerateFiles(@"F:", "*.jpg", SearchOption.AllDirectories);
            foreach (string fileName in MyFiles)
                
            {
                   
                    Console.WriteLine(fileName);
               
 
 
            }
            Console.ReadKey();
        }
 
 
        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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.07.2016, 12:59
Ответы с готовыми решениями:

Поиск файлов по нескольким шаблонам
как искать одновремено несколько форматов файлов к примеру *.jpg *.bmp *.png string...

Поиск по всем разделам диска
Добрый день. Нашел код поиска файлов по названиям или форматам. Но почему он ищет только в...

Выборка файлов из директории по нескольким щаблонам
Для выборки всех jpg файлов из директории можно использовать string Files =...

Поиск по нескольким массивам
есть три массива a b c в первом массиве мы берем элемент a.obj и ищем во втором массиве...

10
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17782 / 13902 / 5323
Регистрация: 17.03.2014
Сообщений: 28,442
Записей в блоге: 1
14.07.2016, 17:03 2
Лучший ответ Сообщение было отмечено postcode0 как решение

Решение

postcode0, сначала модифицируем метод SafeEnumerateFiles на поддержку нескольких шаблонов:
модифицированный 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
private static IEnumerable<string> SafeEnumerateFiles(string path, string[] searchPatterns, 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;
            }
        }
 
        foreach (string searchPattern in searchPatterns)
        {
            string[] files;
            try
            {
                files = Directory.GetFiles(currentDirPath, searchPattern);
            }
            catch (UnauthorizedAccessException)
            {
                break;
            }
            catch (DirectoryNotFoundException)
            {
                break;
            }
            foreach (string filePath in files)
            {
                yield return filePath;
            }
        }
    }
}

Далее вызываем:
C#
1
2
3
4
5
6
7
8
9
string[] drives = {"A:", "B:", "C:"};
foreach (string drv in drives)
{
    IEnumerable<string> MyFiles = SafeEnumerateFiles(drv, new[]{"*.jpg", "*.png", "*.bmp", "*.jpeg"}, SearchOption.AllDirectories);
    foreach (string fileName in MyFiles)
    {
        Console.WriteLine(fileName);
    }    
}
1
0 / 0 / 0
Регистрация: 12.07.2016
Сообщений: 24
14.07.2016, 18:22  [ТС] 3
OwenGlendower, Спасибо вам огромное. И отдельное спасибо за ваш метод с исключением, который я позаимствовал с другой темы)
У меня в консоли выдает с именем файла директорию. Например H:file.jpg. А хотелось бы чтобы отображалось только имя. Раньше нормально было.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17782 / 13902 / 5323
Регистрация: 17.03.2014
Сообщений: 28,442
Записей в блоге: 1
14.07.2016, 18:30 4
postcode0,
C#
1
Console.WriteLine(Path.GetFileName(fileName));
1
0 / 0 / 0
Регистрация: 12.07.2016
Сообщений: 24
14.07.2016, 19:01  [ТС] 5
OwenGlendower, У меня в архиве файлы почему-то меняют названия. например H:file.jpg вместо file.jpg
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
namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] drives = { "F:", "H:" };
            foreach (string drv in drives)
 
            {
                IEnumerable<string> MyFiles = SafeEnumerateFiles(drv, new[] { "*.txt", "*.jpg" }, SearchOption.AllDirectories);
                foreach (string fileName in MyFiles)
                    using (ZipFile p = new ZipFile())
                    {
                        p.CompressionLevel = Ionic.Zlib.CompressionLevel.None; // Задаем максимальную степень сжатия 
 
                        p.AddFile(fileName); // Кладем в архив папку вместе с содежимым
                        p.Save(@"F:" + System.IO.Path.GetFileNameWithoutExtension(fileName) + ".zip"); // Создаем архив
 
 
                        Console.WriteLine(Path.GetFileName(fileName));
 
                        
 
 
                    }              
            }
            Console.ReadKey();
        }
Добавлено через 17 минут
Попробовал накидать внутрь еще папок. Так вот имя меняется только на первой папке/файле. Те файлы что внутри папки отображаются с именем без изменений
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17782 / 13902 / 5323
Регистрация: 17.03.2014
Сообщений: 28,442
Записей в блоге: 1
14.07.2016, 19:37 6
Лучший ответ Сообщение было отмечено postcode0 как решение

Решение

postcode0, если тебе надо чтобы в архиве был просто файл, то замени строку №17 на
C#
1
p.AddFile(fileName, "");
Второй аргумент это имя папки внутри архива для файла. Пустая строка означает корень архива.
1
0 / 0 / 0
Регистрация: 12.07.2016
Сообщений: 24
14.07.2016, 20:09  [ТС] 7
OwenGlendower, Огромное вам спасибо. Ваш ответ решил мне сразу 2 проблемы. Первая проблема была с именами, а вторая проблема заключалась в том, что файлы которые находились в папках архивировались вместе с ними. Теперь все работает как надо. От всей души спасибо!!!
0
0 / 0 / 0
Регистрация: 12.07.2016
Сообщений: 24
17.07.2016, 01:05  [ТС] 8
OwenGlendower, Если поставить второй аргумент, то пароль на архив не ставится. Можно как-то решить эту проблему?
C#
1
2
p.AddFile(fileName, "");
p.Password = "123";
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17782 / 13902 / 5323
Регистрация: 17.03.2014
Сообщений: 28,442
Записей в блоге: 1
17.07.2016, 07:07 9
postcode0, попробуй поменять эти две строки местами
0
0 / 0 / 0
Регистрация: 12.07.2016
Сообщений: 24
17.07.2016, 13:23  [ТС] 10
OwenGlendower, пробовал - безуспешно

Добавлено через 2 часа 39 минут
OwenGlendower, Разобрался) Оказывается пароль на пустой текстовый файл не ставится)
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17782 / 13902 / 5323
Регистрация: 17.03.2014
Сообщений: 28,442
Записей в блоге: 1
17.07.2016, 13:42 11
postcode0, только хотел спросить насчет пустого файла. Недавно был такой же вопрос - Почему создается архив без пароля?
1
17.07.2016, 13:42
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.07.2016, 13:42
Помогаю со студенческими работами здесь

Поиск файлов по нескольким расширениям
void ListFiles(AnsiString path) { if (FindFirst(path+&quot;*.*&quot;, !faDirectory , sr) == 0) { ...

Одновременный поиск файлов по нескольким заданным путям
dir/a-d/b/s D:\Test\*.txt Данная команда найдет все файлы .txt по заданному пути. Подскажите как...

Поиск файлов по нескольким маскам в папках и подпапках
как осуществить поиск файлов сразу по нескольким маскам в папках и подпапках ? используя этот...

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Как проверить существование ключа в объекте или массиве в JavaScript
bytestream 25.01.2025
При разработке веб-приложений на JavaScript программисты постоянно сталкиваются с необходимостью работать с объектами и массивами. Эти структуры данных являются фундаментальными элементами языка и. . .
Как создать ArrayList из массива (array) в Java
bytestream 25.01.2025
При разработке программного обеспечения на языке Java программисты часто сталкиваются с необходимостью эффективного управления наборами данных. Массивы и ArrayList являются двумя фундаментальными. . .
Как сгенерировать случайные целые числа (int) в указанном диапазоне в Java
bytestream 25.01.2025
В программировании генерация случайных чисел является важнейшим инструментом для решения множества практических задач. От создания игровых механик до реализации алгоритмов машинного обучения, от. . .
Как сделать, чтобы grep выводил строки до и после найденной
hw_wired 25.01.2025
Утилита grep стала незаменимым инструментом для поиска и фильтрации информации в Unix-подобных операционных системах. Эта командная утилита позволяет осуществлять поиск строк, соответствующих. . .
Как клонировать определенную ветку в Git
bytestream 24.01.2025
Одной из ключевых функций Git является возможность клонирования веток, что позволяет создавать локальные копии удаленных репозиториев и работать с определенными версиями проекта. Этот механизм. . .
Как в цикле обойти строки DataFrame в Pandas Python
bytestream 24.01.2025
DataFrame представляет собой одну из основных структур данных в библиотеке Python Pandas, которая организует информацию в виде двумерной таблицы с строками и столбцами. Эта структура данных особенно. . .
Как получить имя текущей ветки в Git
bytestream 24.01.2025
При работе с Git часто возникает необходимость определить имя текущей ветки, в которой ведется разработка. Знание текущей ветки является критически важным аспектом для эффективного управления. . .
Как отсортировать массив объектов по значению поля объекта в JavaScript
bytestream 24.01.2025
При разработке веб-приложений на JavaScript разработчики часто сталкиваются с необходимостью работать с массивами объектов. Эти структуры данных представляют собой упорядоченные наборы элементов, где. . .
Ошибка "src refspec master does not match any" при пуше коммита в Git
bytestream 24.01.2025
При работе с системой контроля версий Git разработчики нередко сталкиваются с различными ошибками, одной из которых является сообщение "src refspec master does not match any". Эта ошибка возникает. . .
Как округлить не более двух цифр после запятой в JavaScript
bytestream 24.01.2025
При работе с числами в JavaScript разработчики часто сталкиваются с необходимостью округления десятичных значений до определенного количества знаков после запятой. Это особенно важно при работе с. . .
Как сделать UPDATE из SELECT в SQL Server
hw_wired 24.01.2025
В современных системах управления базами данных операции обновления и выборки данных являются фундаментальными инструментами для работы с информацией. SQL Server предоставляет мощные команды UPDATE и. . .
Как вставить элемент в массив на указанный индекс в JavaScript
hw_wired 24.01.2025
Массивы являются одной из фундаментальных структур данных в JavaScript, предоставляющей разработчикам мощный инструмент для хранения и управления упорядоченными наборами данных. Они позволяют хранить. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru