C# 困惑于如何有效地循环通过正确的文件夹

C# 困惑于如何有效地循环通过正确的文件夹,c#,directoryinfo,C#,Directoryinfo,所以我需要在我们网络上的一组特定文件夹中循环查找文件,并用找到的文件创建新文件夹。 因此,我们有一个文件夹,每天/每周备份文件,供某个部门处理。文件夹以年开始,然后是日期,然后是给定日期的所有文件 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-2

所以我需要在我们网络上的一组特定文件夹中循环查找文件,并用找到的文件创建新文件夹。 因此,我们有一个文件夹,每天/每周备份文件,供某个部门处理。文件夹以年开始,然后是日期,然后是给定日期的所有文件

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\
因此,我正在构建的应用程序从上一年文件夹中获取一个最大日期/年,然后构建一个包含所有大于该年内容的新文件夹

因此,如果我进入我的c:\backup\文件夹,在本例中会出现2018、2019、2020 每年备份文件的每一天都有一个文件夹

现在,如果我的应用程序确定上次处理的最长日期为2019年8月6日 我只需要遍历2019和2020文件夹,找到任何大于2019年8月6日的日期文件夹,并将每个日期内的每个文件复制到相应的新文件夹中

我的第一次尝试是循环遍历相同年份的备份文件夹,但我的困惑是如何高效地循环遍历所有2019个文件夹并转到2020个文件夹,因为这也大于2019年8月6日。一旦我进入2019年,处理这些很快,但是如何编写逻辑代码,以便它知道跳转到2020根文件夹并继续处理

附件是一个文件夹结构的视觉效果,所以它更清晰一点

以下是当前代码,它似乎可以工作,但在无限循环中有一些方法:( BRGDIR是根目录(2019和2020) fldF包含我要查找的每种文件类型的最长日期 sdD包含所有日期文件夹名称(08-07-2019等)

我用这种方法处理每个文件

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(brgDirs中的DirectoryInfo b)同样,它一遍又一遍地处理相同的文件夹和文件,不会跳转到下一个文件夹,即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; }
}

因此,经过一天的反复试验,我找到了一个似乎有效的解决方案。根据上述建议,我建立了一个在子目录中找到的所有路径的列表,然后我循环遍历整个列表,检查并验证我需要的文件,然后执行到新目标文件夹的副本。前两次测试运行看起来正确且成功下一步我将抛出一些奇怪的文件和目录名,看看我的错误处理是否有效

我真的很感谢你的建议。虽然我可能会提出一个新问题,但我需要找到一种方法,从我的课堂上抓住最早的“年”,现在我有这句话

var distinctyear = fldF.Select(x => x.MYEAR).Distinct(); 
但是这个测试使用的是一组简单的文件和文件夹,所以我需要确保如果列表(fldF)中有超过一年的时间,我只需要从中获取最长的时间来设置变量

在这次测试中,fldF有“2019年”和“2020年”,而这次我想要“2019年”

列表中总是有可能有2年的值,所以我总是想得到最老的值


再次感谢您的帮助和建议。

您可以创建一个日期大于08/06/19的列表,然后从该列表中创建文件夹列表,并搜索所有存在的文件夹。这样,您就可以获得一个已存在且日期大于08/06/19的文件夹列表。如何确定您处理的最后一个日期?通过检查desti国家位置文件夹?因此日期文件夹中的文件是带有日期时间的名称,我正在分析该文件名以获取上次处理的最大日期。现在这都是手动过程,有人创建了一个新的“已处理”文件夹,查看上次处理的文件夹以确定上次运行该文件夹的时间,然后将此后的任何新文件复制到新文件夹中。从那里,他们可以对文件/数据执行任何操作。但是,对于某人来说,查看每个文件夹并复制并粘贴到新文件夹是一个漫长的过程。@Sebastian Siemens如果文件夹要循环通过e已经有了一个日期列表,为什么我需要创建一个日期列表?我只是想了解你的建议。答案是否可以抽象出最新处理的日期查找过程,如
GetLastProcessedDate()
?因为没有足够的信息(没有具体的路径、文件夹名称等)用于该过程?
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
var distinctyear = fldF.Select(x => x.MYEAR).Distinct();