Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц, летом дешевле!

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2022, 13:25   #1
Leshakk
Новичок
Джуниор
 
Регистрация: 28.11.2022
Сообщений: 3
По умолчанию Рaбота с дисками и папками. Классы Directory и DirectoryInfo. Как упросnить код?

Добрый день. Подскажите пожалуйста, возможно ли это упростить? Или сократить?

Задача, есть каталог, который строго определен, меняться динамически не будет и должен лежать строго на диске P:\

Программа проверяет есть ли раздел/том/диск P?
Код:
public static void CheckDriveInfo()
        {
            DriveInfo[] drives = DriveInfo.GetDrives();
            bool x = false;
            foreach (DriveInfo drive in drives)
            {
                if (drive.IsReady && drive.Name == "P:\\")
                {
                    x = true;
                    Console.WriteLine($"Название: {drive.Name}");
                    Console.WriteLine($"Тип: {drive.DriveType }");
 
                    Console.WriteLine($"Объем диска: {drive.TotalSize / 1073741824} Gb"); //конвертация кб в гб
                    Console.WriteLine($"Свободное пространство: {drive.TotalFreeSpace / 1073741824} Gb");
                    //Console.WriteLine($"Метка диска: {drive.VolumeLabel}");
                    break;
                }
            }
            if (x == false)
                Console.WriteLine("На вашем компьюетере нет диска P:\\");
        }
Затем начинает проверять все папки сверху до низу. Если есть нужная папка -ок! Если нет создаем. Проверяем наличие левых папок с левыми именами, находим убиваем. Переходим на уровень ниже.
И вот тут начинается веселье. Это что получается для каждого уровня вот такой кусок кода? И чем глубже в иерархию тем запутанее? А если несколько веток будет, это же вообще с ума сойти можно.
код:
Код:
C#Выделить код

public static void DirCorrIgnor_IncorrDell_NoCreate()
        {
            string dirName = "P:\\2020Test";
             string dirName_a = "P:\\2020Test\\a";
            string dirName_b = "P:\\2020Test\\b";
 
            string dirName_a_1 = "P:\\2020Test\\a\\1";
            string dirName_a_2 = "P:\\2020Test\\a\\2";
 
            
 
            // если папка существует
            if (Directory.Exists(dirName))
            {
                Console.WriteLine("Имеются следующие папки:");
                string[] dirs = Directory.GetDirectories(dirName);
 
                foreach (string s in dirs)
                {
                    Console.WriteLine(s);
                    if ((s == dirName_a) || (s == dirName_b))
                        continue;
                    else
                        Directory.Delete(s, true);
                }
 
                DirectoryInfo dirInfo = new DirectoryInfo(dirName_a);
                if (!dirInfo.Exists)
                    dirInfo.Create();
               
                DirectoryInfo dirInfo2 = new DirectoryInfo(dirName_b);
                if (!dirInfo2.Exists)
                    dirInfo2.Create();
                //-------------------------------------------------------
                string[] dirs2 = Directory.GetDirectories(dirName_a);
 
                foreach (string s1 in dirs2)
                {
                    Console.WriteLine(s1);
                    if ((s1 == dirName_a_1) || (s1 == dirName_a_2))
                        continue;
                    else
                        Directory.Delete(s1, true);
                }
 
                DirectoryInfo dirInfo3 = new DirectoryInfo(dirName_a_1);
                if (!dirInfo3.Exists)
                    dirInfo3.Create();
 
                DirectoryInfo dirInfo4 = new DirectoryInfo(dirName_a_2);
                if (!dirInfo4.Exists)

                    dirInfo4.Create();
            }
        }
Есть еще вот такие размышления:

Можно конечно проверять ветки целиком
P:\\2020Test\\a\\1";
Потом
P:\\2020Test\\a\\2";
потом
P:\\2020Test\\b\\1";
потом
P:\\2020Test\\b\\2";

И так же целиком их убивать при наличии ошибки.
Например если есть
P:\\2020Test\\b\\аброкодабра";
то ее целиком убить и создать
P:\\2020Test\\b\\1";
и
P:\\2020Test\\b\\2";

Но из за одной аброкадабры, которая лежит в самом низу, убивать всю ветку, как то зверски. А если там еще и файлы лежат....
Поэтому хотелось бы иметь контроль не тлько по веткам а еще и по глубине.
Например
P:\\2020Test проверка и какие-то действия если надо
потом
P:\\2020Test\\b проверка и какие-то действия если надо
потом
P:\\2020Test\\b\\1"; проверка и какие-то действия если надо

И вот тут приходит единственная мысль на ум, создать один метод, который принимает в качестве аргумента кусок пути, и обрабатывает его, проверяет наличие, чистит, убивает лишнее, создает чего нехватает.

Все куски путей от P:\ до P:\\2020Test\\b\\1"; и по всем веткам, загнать в массив. Так продумать тобы в маасиве куски путей были в правильной последвоательности

И в цикле обрабатывать этот массив одним методом, в параметрах меняя лишь индекс элемента.

С учетом того что дирректория, хоть и большая, но конечная, это все реально сделать руками.
Эскать какие-то экзотические метода, классы и Linq которые сами все сделают в одну строку, уже нет сил.

Последний раз редактировалось Leshakk; 28.11.2022 в 13:29.
Leshakk вне форума Ответить с цитированием
Старый 28.11.2022, 13:45   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,342
По умолчанию

Начните с простого: DriveInfo можно передать букву нужного диска, а не делать цикл.
p51x вне форума Ответить с цитированием
Старый 28.11.2022, 14:25   #3
Leshakk
Новичок
Джуниор
 
Регистрация: 28.11.2022
Сообщений: 3
По умолчанию

p51x, То есть в куске кода в самом начале поста, проверить наличие диска P и сообщить о его отсутсвии можно просто без циклов?
Спасибо, попробую разобраться.
Leshakk вне форума Ответить с цитированием
Старый 28.11.2022, 14:46   #4
Leshakk
Новичок
Джуниор
 
Регистрация: 28.11.2022
Сообщений: 3
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Начните с простого: DriveInfo можно передать букву нужного диска, а не делать цикл.
Ура! Работает Спасибо большое! Так просто было!
Код:
DriveInfo driveInfo = new DriveInfo("P");
            if (driveInfo.IsReady == true)
            {
                Console.WriteLine(driveInfo.Name);
                Console.WriteLine(driveInfo.TotalSize / 1024 / 1024 / 1024);
                Console.WriteLine(driveInfo.AvailableFreeSpace / 1024 / 1024 / 1024);
            }
            else
                Console.WriteLine("Увы и ах, диска P:\\ нет на вашем компьютере");
Leshakk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц, летом дешевле!

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рaбота з объектами ядра Windows. andriy1992p Win Api 10 03.09.2011 22:28
кypсовaя рaбота (любой язык программирования) motaro Фриланс 7 28.07.2011 12:34
Проблема с логическими дисками. Gol-san Операционные системы общие вопросы 9 26.08.2010 19:36
Непонятка с жесткими дисками insense Софт 6 23.10.2009 00:29
Проблемы с дисками ds.Dante Свободное общение 6 28.09.2009 14:17