Запутался в том, как эффективно l oop через правильные папки - PullRequest
0 голосов
/ 24 марта 2020

Так что мне нужно l oop через набор указанных c папок в нашей сети для поиска файлов и создания новой папки с найденными файлами. Таким образом, у нас есть папка, в которую мы ежедневно / еженедельно копируем файлы для обработки определенным отделом. Папки начинаются как ГОД, затем ДАТА, а затем все файлы на эту дату

Example:
c:\backup\2018
       c:\backup\2018\06-06-2018\
c:\backup\2019
       c:\backup\2019\09-20-2019\
c:\backup\2020
       c:\backup\2020\02-20-2020\

Так что мое приложение, которое я создаю, получает МАКСИМАЛЬНУЮ дату / год из папки предыдущего года, а затем создает новая папка со всем БОЛЬШЕ чем в этом году

Так что, если я go в мою папку c: \ backup \, в этом примере будет 2018, 2019, 2020, в течение каждого года будет папка для каждого файлы дня были заархивированы.

Теперь, если мое приложение определит, что МАКСИМАЛЬНАЯ дата с момента нашей последней обработки была 8/6/2019, мне нужно l oop ТОЛЬКО для папок 2019 и 2020 годов, найти любую папку даты, которая больше 6/8/2019, и скопируйте каждый файл в пределах каждой даты в соответствующую новую папку.

Моя первая попытка состояла в том, чтобы l oop через папку резервных копий для папки года, которая является такой же, но моя путаница заключается в том, как мне эффективно l oop через все папки 2019 и перейти к папке 2020 , так как это больше, чем 6/8/2019. Как только я попал в 2019, их обработка была быстрой, но как кодировать эту логику c, чтобы она могла перейти в папку 2020 root и продолжить обработку?

Прикрепленное изображение структура папок, поэтому она немного более понятна

enter image description here

Вот текущий код, который, кажется, работает, но кое-как как в бесконечном l oop :( BrgDirs - это каталоги root (2019 и 2020). FldF содержит максимальную дату для каждого типа файла, который он ищет. SdD содержит все имена папок даты (08-07-2019, et c ..)

    foreach (DirectoryInfo b in brgDirs)
    {
        int bd = Convert.ToInt32(b.Name);
        DateTime bdt = new DateTime(bd, 1, 1);
        foreach(Wave w in fldF)
        {
            int wd = Convert.ToInt32(w.MYEAR);
            DateTime wdt = new DateTime(wd, 1, 1);
            if (wdt >= bdt)
            {
                DirectoryInfo[] sdD = b.GetDirectories();
                foreach (DirectoryInfo sd in sdD)
                {
                    DateTime pWDate = DateTime.Parse(w.MDATE);
                    DateTime pSDate = DateTime.Parse(sd.Name);                            
                    if(pSDate.Date > pWDate.Date)
                    {
                        ProcessEachFolder(sd.FullName);
                    }
                }
            }
        }
    }

И я обрабатываю Обработка каждого файла этим методом

private void ProcessEachFolder(string fpath)
{
    string[] fileEntries = Directory.GetFiles(fpath);  // WAVE SUBFOLDER FOLDER PATH
    waveDirectory = @"C:\backup\Test\" + currentWave;

    foreach (string d in fileEntries)
    {
        string fileNAME = Path.GetFileName(d);
        if (d.Contains("CLEARANCE_MOD"))
        {
            File.Copy(d, waveDirectory + @"\CLR\" + fileNAME, true);
        }
        if (d.Contains("DEALS_MOD"))
        {
            File.Copy(d, waveDirectory + @"\HD\" + fileNAME, true);
        }
        if (d.Contains("DROP_MOD"))
        {
            File.Copy(d, waveDirectory + @"\PD\" + fileNAME, true);
        }
        if (d.Contains("LABELS_MOD"))
        {
            File.Copy(d, waveDirectory + @"\UPL\" + fileNAME, true);
        }

    }
}

После первого запуска и просмотра файлов, заполненных в правильных папках, я остановил приложение, но затем я снова запустил его без точек останова и позволил ему работать, и он продолжал работать и работать .. и он никогда больше не попадает в foreach (DirectoryInfo b в brgDirs), он снова и снова обрабатывает одни и те же папки и файлы и не будет переходить к следующему папка, которая является папкой 2020 года.

List<Wave> fldF = new List<Wave>();

private class Wave
{
    public string FLD { get; set; }
    public string MDATE { get; set; }
    public string MYEAR { get; set; }
}

Значения в пределах fldF в настоящее время похожи на

FLD = CL, MDATE = 08-06-2019, MYEAR = 2019
FLD = HD, MDATE = 08-06-2019, MYEAR = 2019
FLD = PD, MDATE = 08-01-2019, MYEAR = 2019
FLD = UP, MDATE = 08-06-2019, MYEAR = 2019

1 Ответ

0 голосов
/ 27 марта 2020

Итак, после дня проб и ошибок я нашел решение, которое, кажется, работает. Принимая вышеизложенные предложения, я создаю Список всех путей, найденных в подкаталогах, затем перебираю весь этот список и проверяю и проверяю нужные мне файлы, а затем выполняю копию в новую папку назначения. Первые 2 теста выглядят правильно и успешно. Затем я собираюсь добавить несколько странных файлов и имен каталогов, чтобы проверить, работает ли моя обработка ошибок.

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

var distinctyear = fldF.Select(x => x.MYEAR).Distinct(); 

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

В этом тесте fldF имел значение «2019» и «2020» и для этого я бы хотел «2019»

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

еще раз спасибо за помощь и предложения.

...