Использование DirectoryInfo [] для вывода списка каталогов и их содержимого - PullRequest
0 голосов
/ 14 марта 2011

Это займет некоторое время, чтобы объяснить, но потерпите меня.

Я автоматизирую создание записей о проектах и ​​лидах в нашей базе данных, основываясь на существовании подкаталогов по определенному пути. Структура каталогов состоит из трех уровней. Я указываю, что код на верхнем уровне возвращает подкаталоги (регионы) в массив объектов DirectoryInfo, например:

DirectoryInfo[] classARegions = dir.GetDirectories("*", SearchOption.TopDirectoryOnly);

Каталоги, с которыми я хочу работать, являются подпрограммами этого уровня региона, поэтому я перебираю массив DirectoryInfo с помощью:

foreach (DirectoryInfo region in classARegions)

Затем я перебираю каталоги объектов DirectoryInfo региона таким же образом:

DirectoryInfo[] prospects = region.GetDirectories("*", SearchOption.TopDirectoryOnly);

До этого момента все в порядке. Проблема, с которой я сталкиваюсь, заключается в том, что после того, как я закончу обработку подкаталогов первого региона и вернусь через цикл ForEach, я обнаружил, что мой массив перспективы не был повторно инициализирован как пустой. Вместо этого теперь он включает в себя все подкаталоги из предыдущей итерации в дополнение к подкаталогам для текущей итерации.

Мой вопрос сводится к тому, что я делаю это неправильно или есть способ очистить массив перспективы , чтобы он заполнялся только подкаталогами из области этой итерации?

* Весь метод размещен ниже.

 public string UpdateProspectInfo()
    {
        int countAdded = 0;
        int countExisting = 0;
        int countAddedOverall = 0;
        int countExistingOverall = 0;

        StringBuilder summary = new StringBuilder();
        StringBuilder existing = new StringBuilder();
        StringBuilder added = new StringBuilder();
        string prospectDir = ConfigurationManager.AppSettings["ProspectDir"].ToString();

        // get list of folders in Class A
        DirectoryInfo dir = new DirectoryInfo(prospectDir);
        DirectoryInfo[] classARegions = dir.GetDirectories("*", SearchOption.TopDirectoryOnly);

        summary.Append("Found " + classARegions.Length + " Class A Regions.\r\n");

        foreach (DirectoryInfo region in classARegions)
        {
            string regionName = (region.Name.Length > 50 ? region.Name.Substring(0, 50) : region.Name);

            DirectoryInfo[] prospects = region.GetDirectories("*", SearchOption.TopDirectoryOnly);                
            summary.Append("\r\n  Region: " + regionName + " contains " + prospects.Length + " prospect folders.\r\n");                

            foreach (DirectoryInfo prospect in prospects)
            {                    
                string projNum;
                string projName;

                int seperator = prospect.Name.IndexOf("-");
                // go to next prospect if name doesn't contain a - character
                if (seperator == -1)
                    continue;

                projNum = prospect.Name.Substring(0, seperator);
                projName = prospect.Name.Substring(seperator + 1);

                ProjectCollection temp = new Select().From<Project>()
                .Where("ProjectName").IsEqualTo(projName)
                .ExecuteAsCollection<ProjectCollection>();

                if (temp.Count < 1)
                {
                    Project tempProj = new Project();
                    tempProj.ProjectNumber = projNum;
                    tempProj.ProjectName = projName;
                    tempProj.PMAssigned = "Joe Smith";
                    tempProj.PMUserID = 108;
                    tempProj.ProjectActivity = "Active";
                    tempProj.ProjectLead = "Lead";
                    //tempProj.Location = projNum.Substring(0,50);
                    tempProj.DirectoryPath = prospect.FullName;

                    tempProj.Save();
                    countAdded++;

                    added.Append("      " + projName + "\r\n");
                }
                else
                {
                    ((Project)temp[0]).DirectoryPath = prospect.FullName;
                    ((Project)temp[0]).Save();
                    countExisting++;
                }                    
            }

            // add summary for each region
            summary.Append("    Added " + countAdded + " prospects.\r\n");
            summary.Append(added.ToString());
            summary.Append("    Processed " + countExisting + " prospects that already existed in the database.\r\n");

            // update counts and continue to next region
            countAddedOverall += countAdded;
            countExistingOverall += countExisting;
            countAdded = 0;
            countExisting = 0;
        }           

        return summary.ToString();
    }

1 Ответ

0 голосов
/ 28 января 2014

Решение этой проблемы было найдено путем поиска в другом направлении благодаря комментарию @BrokenGlass.

Решение: я пропускал папки, если в имени отсутствовал символ "-". В моем итоговом электронном письме я не учел пропущенные папки. Общее количество папок вернулось выше, чем сумма countAdded и countExisting. Прогулка по коду снова привела меня к этой строке:

if (seperator == -1) continue;

Я выходил из цикла каждый раз, когда нажимал на имя файла без символа "-".

...