Ошибка в программе. Запоминается только последний список файлов - C#

Узнай цену своей работы

Формулировка задачи:

Пытаюсь написать простую программу, которая перебирает папки и ищет файлы, полный путь которых длиннее заданного значения. Все ошибочные файлы хранятся в объекте класса MyClass
    class MyFile
    {
        public string folder;
        public List<string> files;
 
        public MyFile()
        {
        }
 
        public MyFile(string pathfolder)
        {
            files = new List<string>();
            folder = pathfolder;
            files.AddRange(Directory.GetFiles(pathfolder));
        }
 
    }
Поле folder заполняется правильно, а files - нет, в него заполняются файлы только последней проверяемой папки. Уже все глаза сломал, но не могу понять почему так. Прошу помочь разобраться. полный код тут:
namespace MyExp
{
    public partial class Form1 : Form
    {
        public int len_err; //допустимая длина файла
 
        public Form1()
        {
            InitializeComponent();
            len_err = 112;
            textBox2.Text = len_err.ToString();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            MyFile ob; 
 
            textBox1.Clear();
 
            len_err = Convert.ToInt32(textBox2.Text);  //допустимая длина файла
 
            string startpathfolder = Directory.GetCurrentDirectory();
 
            textBox1.AppendText(startpathfolder+Environment.NewLine);
 
            int len; // длина пути проверяемого файла
 
            string[] pathfolders = Directory.GetDirectories(startpathfolder, "*", SearchOption.AllDirectories); //массив со всеми вложенными папками
 
            List<MyFile> allfiles = new List<MyFile>(); //папки с  файлами (объект)
            List<MyFile> allfiles_err = new List<MyFile>(); //папки с ошибочными файлами (объект)
 
            List<string> files_err = new List<string>(); //ошибочные файлы
 
            List<string> pro = new List<string>(); //для проверки
 
            foreach (string s in pathfolders)  //заполнить allfiles объектами ob
            {
                allfiles.Add(new MyFile(s));  // при создании объекта класса MyFile в конструкторе заполняются поля  folder и List<string> files - все файлы в папке
            }

            foreach (MyFile o in allfiles) // заполнить структуру allfiles_err папками и ошибочными файлами
            {
                textBox1.AppendText(o.folder + Environment.NewLine);
 
                files_err.Clear();
                foreach (string s in o.files)
                {
 
                    len = s.Length;
                    textBox1.AppendText("     " + "[" + len.ToString() + "]  " + s + Environment.NewLine);
                    if (len > len_err)
                    {
                        files_err.Add(s); // заполнить массив ошибочными файлами
                        pro.Add(s);
                        textBox1.AppendText("добавлен в files_err " + files_err[0] + Environment.NewLine);
                    }
 
                }
                if (files_err.Count != 0) //если массив с ошибочными файлами не пустой, то создать объект
                {
                    ob = new MyFile();
                    ob.folder = o.folder;
                    ob.files = files_err;
                    //MessageBox.Show(files_err[0]);
                    //MessageBox.Show(files_err[1]);
 
                   // MessageBox.Show(ob.folder);
                    //MessageBox.Show(ob.files[0]);
                    //MessageBox.Show(ob.files[1]);
 
                    allfiles_err.Add(ob);

                }
                textBox1.AppendText(Environment.NewLine + Environment.NewLine);
            }
 
            textBox1.AppendText(Environment.NewLine + "---проверочный массив---" + Environment.NewLine);
            foreach (string s in pro)
            {
                textBox1.AppendText(s + Environment.NewLine);
            }
            textBox1.AppendText(Environment.NewLine + "---проверочный массив---" + Environment.NewLine);
 
            /*
            MessageBox.Show(obs_err[0].folder);
            MessageBox.Show(obs_err[0].files[0]);
            MessageBox.Show(obs_err[0].files[1]);
 
            MessageBox.Show(obs_err[1].folder);
            MessageBox.Show(obs_err[1].files[0]);
            MessageBox.Show(obs_err[1].files[1]);
            */

            textBox1.AppendText(Environment.NewLine + "---отчет---" + Environment.NewLine);
            // печать файлов, длина которых больше заданной
            foreach (MyFile ob123 in allfiles_err)
            {
                textBox1.AppendText(ob123.folder + Environment.NewLine); //имя папки
 
                foreach (string s in ob123.files)
                {
                    textBox1.AppendText("     "+"["+s.Length+"]  "+    s + Environment.NewLine); //имена файлов
                }
                textBox1.AppendText(Environment.NewLine);
            }

        } //private void button1_Click(object sender, EventArgs e)

    }  //public partial class Form1 : Form

    class MyFile
    {
        public string folder;
        public List<string> files;
 
        public MyFile()
        {
 
        }

        public MyFile(string pathfolder)
        {
            files = new List<string>();
 
            folder = pathfolder;
        
            files.AddRange(Directory.GetFiles(pathfolder));
        }
 
    }
 
}
программа во вложении (пример с файлами и папками в папке Debug, по умолчанию стоит значение максимальной длины=72, чтобы ошибочными были файлы в папкам "п1" и "п3")

Решение задачи: «Ошибка в программе. Запоминается только последний список файлов»

textual
Листинг программы
List<string> list1 = new List<string>();
list1.Add("aaaa"); list1.Add("bbbb"); list1.Add("cccc");
 
List<string> list2 = list1;
 
Console.WriteLine(list1.Count); // 3
Console.WriteLine(list2.Count); // 3
 
list1.Clear();
 
Console.WriteLine(list1.Count); // 0
Console.WriteLine(list2.Count); // Тоже 0. Как же так???

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы