Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Рaбота с дисками и папками.


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

Задача, есть каталог, который строго определен, меняться динамически не будет и должен лежать строго на диске 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:\\");
        }


Затем начинает проверять все папки сверху до низу. Если есть нужная папка -ок! Если нет создаем. Проверяем наличие левых папок с левыми именами, находим убиваем. Переходим на уровень ниже.
И вот тут начинается веселье. Это что получается для каждого уровня вот такой кусок кода? И чем глубже в иерархию тем запутанее? А если несколько веток будет, это же вообще с ума сойти можно.
код:
Код

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"; и по всем веткам, загнать в массив. Так продумать тобы в маасиве куски путей были в правильной последвоательности

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

С учетом того что дирректория, хоть и большая, но конечная, это все реально сделать руками.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)