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

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

14.07.2016, 12:59. Показов 1451. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2016, 12:59
Ответы с готовыми решениями:

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

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

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

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

10
Администратор
Эксперт .NET
17551 / 13774 / 5298
Регистрация: 17.03.2014
Сообщений: 28,250
Записей в блоге: 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
17551 / 13774 / 5298
Регистрация: 17.03.2014
Сообщений: 28,250
Записей в блоге: 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
17551 / 13774 / 5298
Регистрация: 17.03.2014
Сообщений: 28,250
Записей в блоге: 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
17551 / 13774 / 5298
Регистрация: 17.03.2014
Сообщений: 28,250
Записей в блоге: 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
17551 / 13774 / 5298
Регистрация: 17.03.2014
Сообщений: 28,250
Записей в блоге: 1
17.07.2016, 13:42 11
postcode0, только хотел спросить насчет пустого файла. Недавно был такой же вопрос - Почему создается архив без пароля?
1
17.07.2016, 13:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
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
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru