开发者

Using DirectoryInfo[] to list directories and their contents

开发者 https://www.devze.com 2023-02-16 13:18 出处:网络
This is going to take a while to explain but bear with me. I\'m automating the creation of project and lead records in our database based on the existence of sub directories at a certain path.The dir

This is going to take a while to explain but bear with me.

I'm automating the creation of project and lead records in our database based on the existence of sub directories at a certain path. The directory structure is three levels deep. I point the code at the top level return the subdirectories (regions) into an array of DirectoryInfo objects like so:

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

The directories I want to work with are subs of this region level so I iterate through the DirectoryInfo array with:

foreach (DirectoryInfo regio开发者_JS百科n in classARegions)

I then iterate through the region DirectoryInfo objects subdirectories in the same way:

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

Everything is ok up to this point. The problem I run into is after I finish processing the first region's subdirectories and head back through the ForEach loop I find that my prospects array isn't re-initialized as empty. Instead it now includes all the sub directories from the prior iteration in addition to the subdirectories for the current iteration.

My question boils down whether I'm doing this wrong or if there a way to empty the prospects array so it's only populated with subdirectories from this iteration's region?

* Entire Method is posted below.

 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();
    }


The solution to this was arrived at by digging in another direction thanks to the comment from @BrokenGlass.

Solution: I was skipping folders if the name lacked a "-" char. In my summary email I wasn't accounting for the skipped folders. The total # of folders came back higher than the sum of countAdded and countExisting. Walking through the code again led me to this line:

if (seperator == -1) continue;

I was leaving the loop anytime I hit a filename without a "-" character.

0

精彩评论

暂无评论...
验证码 换一张
取 消