Я хочу выбрать нужную папку и хочу, чтобы она автоматически выполняла поиск по всем другим папкам в этом каталоге, условно C# - PullRequest
0 голосов
/ 16 апреля 2020

Итак, вот папка, которую я выберу sh: Выбранная папка с использованием FBD

В этой папке BackPath находятся 7 других папок с датами, как показано: Датированные папки внутри выбранная папка

Внутри каждой из этих устаревших папок есть еще две папки с именами «In» и «Out».

Я просто хочу выбрать папку BackPath, а затем когда я запускаю свой метод импорта, я хочу, чтобы он просматривал каждую из датированных папок и просматривал только папки «Out» в каждой и игнорировал каждую папку «In».

Вот мой метод chooseInputFolder:

private void ChooseInputFolder()
    {
        try
        {
            FolderBrowserDialog fbd = new FolderBrowserDialog();
            fbd.Description = "Please Select An Input Path";
            fbd.SelectedPath = @"C:\";

            if (fbd.ShowDialog() == DialogResult.OK)
            {
                tbInputPath.Text = fbd.SelectedPath;
            }

        }
        catch (Exception ex)
        {
            MessageBox.Show("Error Occured While Trying To Populate Combo Boxes : " + ex.Message);
        }
    }

Вот мой foreach l oop, который выглядит в выбранном каталоге:

foreach (var files in Directory.GetFiles(strPath))

Ответы [ 3 ]

0 голосов
/ 16 апреля 2020

код sudo, чтобы вы поняли .....

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

если ваш файл был 9 папками глубиной это было бы много для каждого блока. этот код не требует никаких изменений независимо от глубины

Start()
{
    var directories= SomeList(path);
    Search(directories)
}

Search(List<T> directorys)
{
    foreach(var item in directorys)
    {
        //some if conditions to end early if you find what you looking for.         
        //or logic to maintain tracking of sorts.

        //next set
         var folders = GetFolder(item);
         Search(folders)
    }
}
0 голосов
/ 17 апреля 2020

Как и предлагали другие, вы можете использовать рекурсию, чтобы упростить ваш код и получить нужную папку.

Я создаю пример кода, и вы можете посмотреть.

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
           folderBrowserDialog1.SelectedPath = @"D:\";
            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = folderBrowserDialog1.SelectedPath;
            }
            DirSearch(textBox1.Text);
        }


        public void DirSearch(string sDir)
        {
            try
            {
                foreach (string d in Directory.GetDirectories(sDir))
                {
                    foreach (string f in Directory.GetDirectories(d))
                    {
                        if(f.Contains("In"))
                        {
                            listBox1.Items.Add(f);
                        }

                    }
                    DirSearch(d);
                }
            }
            catch (System.Exception excpt)
            {
                Console.WriteLine(excpt.Message);
            }
        }
    }

результат:

enter image description here

0 голосов
/ 16 апреля 2020

Так что мне удалось решить эту проблему с помощью следующего кода:

foreach (string subDir1 in Directory.GetDirectories(strPath))
                {
                    foreach (string subDir2 in Directory.GetDirectories(subDir1))
                    {
                        foreach (var files in Directory.GetFiles(subDir2))
                        {
                            if(subDir2.Contains("In"))
                            {
                                //IMPORT FILES METHOD GOES HERE
                            }
                            else
                            {
                                continue;
                            }

                        }
                    }

                }
...