Форум программистов, компьютерный форум, киберфорум
sysrepos
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Ошибки в библиотеках NET.

Запись от sysrepos размещена 15.11.2016 в 15:42
Обновил(-а) sysrepos 15.11.2016 в 17:30

Оказывается, в простейших, часто используемых методах NET могут быть ошибки, которые без обработки выкинут исключение, и ваша прога аварийно завершиться.
Например, простейший вызов метода, который ищет все директории или файлы в заданном каталоге
C#
1
Directory.GetDirectories(path,"*",SearchOption.AllDirectories);
или
C#
1
Directory.GetFiles(path, "*", SearchOption.AllDirectories);
вылетит с исключением, если в него попадется папка, к которой нет доступа, и списка вложенных файлов или папок в итоге вы не получите.

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

Моя реализация данной задачи:

Кликните здесь для просмотра всего текста
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
    class MyLib
    {
        string path;
        SearchOption searchOption;
        public List<string> rezdirs;
        public List<string> rezdirs_error;
 
        public MyLib(string path, SearchOption searchOption)
        {
            this.path = path;
            this.searchOption = searchOption;
            rezdirs = new List<string>();
            rezdirs_error = new List<string>();
 
            GetFolders();
        }
 
 
        public List<string> GetFolders() //метод
        {
            Stack<string> dirs = new Stack<string>();
            string[] subDirs;
            dirs.Push(path);
 
            while (dirs.Count > 0)
            {
                string currentDirPath = dirs.Pop();
                if (searchOption == SearchOption.AllDirectories)
                {
                    try
                    {
                        subDirs=new string[0];
                        subDirs = Directory.GetDirectories(currentDirPath);
                        foreach (string subDirPath in subDirs)
                        {
                            dirs.Push(subDirPath);
                            rezdirs.Add(subDirPath);
                        }
                    }
                    catch (UnauthorizedAccessException)
                    {
                        rezdirs_error.Add(currentDirPath);
                        continue;
                    }
                    catch (DirectoryNotFoundException)
                    {
                        rezdirs_error.Add(currentDirPath);
                        continue;
                    }
                }
 
     
            }
 
            return rezdirs;
        }
 
        public List<string> GetFiles() //метод 
        {
            List<string> files = new List<string>();
            try
            {
                files.AddRange(Directory.GetFiles(path));
            }
            catch
            {
 
            } files.Add("нет доступа к папке");
 
            return files;
 
        }
 
 
 
    }
Размещено в Без категории
Показов 1438 Комментарии 3
Всего комментариев 3
Комментарии
  1. Старый комментарий
    Аватар для sysrepos
    хорошая статья! пиши еще
    Запись от sysrepos размещена 15.11.2016 в 17:31 sysrepos вне форума
  2. Старый комментарий
    Аватар для Avazart
    А что хорошего то?
    Что человек первый раз узнал про исключения?

    Как бы в С++ boost/filesystem приблизительно то же поведение.
    Запись от Avazart размещена 15.11.2016 в 20:52 Avazart вне форума
  3. Старый комментарий
    Аватар для sysrepos
    дело не в исключении, а то, что метод Directory.GetDirectories нет смысла использовать в программе, так как к какой нибудь вложенной папке может не быть доступа, и метод вместо массива папок выкинет исключение.
    В итоге, чтобы точно получить массив с папками нужно использовать свой метод.

    Ключевая мысль в данном посте "чтобы корректно выполнить данную задачу..."
    а не "...могут быть ошибки, которые без обработки выкинут исключение"
    Запись от sysrepos размещена 16.11.2016 в 10:52 sysrepos вне форума
    Обновил(-а) sysrepos 16.11.2016 в 10:54
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru