【问题标题】:How to process files inside sub folders but not from folders inside sub folder如何处理子文件夹内的文件而不是子文件夹内的文件夹
【发布时间】:2015-02-13 13:20:34
【问题描述】:

我开发了一个 SSIS 包,它将 excel 文件加载到 SQLSERVER 数据库。包工作正常。但我需要根据以下要求修改包。

主文件夹名称:“ROOT” 子文件夹:“A”、“B”、“C” 每个子文件夹内的文件夹:“已处理”, “ 无效的” 以及包运行时必须处理的新 excel 文件。

现在我需要处理每个子文件夹“A”、“B”和“C”中的文件,而不是“已处理”和“无效”文件夹中的文件

这是因为一旦我处理了文件,包就会将该文件移动到“已处理”文件夹,如果它无法处理特定的 excel 文件包会将文件移动到“无效”文件夹。

因此,每个子文件夹中的“已处理”和“无效”文件夹仅包含旧文件。我尝试使用两个 foreach 循环……但失败了,这对我来说是一个很大的困惑。如果我在 foreach 循环中启用“遍历子文件夹”选项,它也在处理已经处理的文件。 请有人帮我解决这个问题

【问题讨论】:

  • 您能否发布更多关于您如何尝试使用两个 foreach 循环的详细信息?似乎这将是要走的路。为什么你的尝试失败了?

标签: sql-server excel ssis


【解决方案1】:

您需要一个脚本任务来填充变量中的文件夹和一个 ForEach 循环,该循环从脚本任务填充的数组中返回文件夹名称。

这是一个方法:

http://microsoft-ssis.blogspot.com/2011/01/foreach-folder-enumerator.html

在 ForEach 中,您需要添加另一个 ForEach 文件循环和其余组件。请注意,我链接的方法有两个脚本任务选项,第一个只会为您提供父文件夹的子文件夹,这就是您所要求的,但第二个会遍历所有子文件夹,因此您需要过滤如果您使用该脚本,则删除您不想要的子文件夹。

【讨论】:

    【解决方案2】:

    这在源脚本组件中适用于我

    System.IO.DirectoryInfo root = new System.IO.DirectoryInfo(@"c:\temp\");
    
    foreach (var subDir in root.GetDirectories())
    {
        foreach (var item in subDir.GetFiles("*.csv"))
        {
            Output0Buffer.AddRow();
            Output0Buffer.FileName = item.FullName;
        }
    }
    Output0Buffer.EndOfRowset();
    

    【讨论】: