如何在SSIS包中使用Foreach循环容器选择最近创建的文件夹?

时间:2011-07-04 13:02:25

标签: file ssis ienumerator

我对SSIS有一个有趣的挑战。使用for-each文件枚举器,我需要选择最近创建的子文件夹,然后遍历每个文件。

也许一个例子会更好地解释。文件夹看起来像这样:

C:\数据\ 2011-0703

C:\数据\ 2011-0626

C:\数据\ 2011-0619

如何为每个文件枚举器选择最新的文件夹?这可以通过查看创建日期或比较文件名来实现。

我猜它会在枚举器中用表达式完成,只是不知道怎么做!在网上找不到任何东西。

由于

2 个答案:

答案 0 :(得分:5)

您可以在Script Task的帮助下实现此目的。以下示例显示了如何完成此操作。该示例是在SSIS 2008 R2中创建的。

分步流程:

  1. 在文件夹路径2011-0619中创建名为2011-06262011-0703C:\temp\的三个文件夹,如屏幕截图# 1 所示。记下每个文件夹的Date created值。

  2. 在每个文件夹中放置少量文件,如屏幕截图# 2 - # 4 所示。

  3. 在SSIS包上,创建四个变量,如屏幕截图# 5 所示。使用值C:\temp\设置变量 RootFolder (在您的情况下,这将是c:\ data)。将变量 FilePattern 设置为值*.*。变量 RecentFolder 将在脚本任务中分配最近的文件夹路径。要避免设计时错误,请为变量 RecentFolder 指定有效的文件路径。当文件在最近的文件夹中循环时,将为变量 FilePath 分配值。

  4. 在SSIS包上,放置一个脚本任务。将脚本任务中的Main()方法替换为脚本任务代码(获取最近的文件夹)部分下的脚本任务代码。此脚本获取根文件夹中的文件夹列表,并循环检查创建日期时间以选择最近创建的文件夹。最近创建的文件夹路径随后存储在变量 RecentFolder 中。

  5. 在SSIS包上,放置一个Foreach循环容器并按照屏幕截图# 6 和# 7 所示进行配置。

  6. 将一个脚本任务放在Foreach循环容器中。将脚本任务中的Main()方法替换为脚本任务代码(显示文件名)部分下的脚本任务代码。此脚本只显示最近创建的文件夹中的文件名称。

  7. 配置完所有任务后,该软件包应如屏幕截图# 8 所示。

  8. 屏幕截图# 9 - # 11 显示该程序包在最近创建的文件夹 2011-0703 中显示文件名。

  9. 希望有所帮助。

    脚本任务代码(获取最近的文件夹):

    C#代码只能在 SSIS 2008及以上版本中使用。

    public void Main()
    {
        Variables varCollection = null;
    
        Dts.VariableDispenser.LockForRead("User::RootFolder");
        Dts.VariableDispenser.LockForWrite("User::RecentFolder");
        Dts.VariableDispenser.GetVariables(ref varCollection);
    
        string rootFolder = varCollection["User::RootFolder"].Value.ToString();
        DateTime previousFolderTime = DateTime.MinValue;
        string recentFolder = string.Empty;
    
        foreach (string subFolder in System.IO.Directory.GetDirectories(rootFolder))
        {
            DateTime currentFolderTime = System.IO.Directory.GetCreationTime(subFolder);
            if (previousFolderTime == DateTime.MinValue || previousFolderTime <= currentFolderTime)
            {
                previousFolderTime = currentFolderTime;
                recentFolder = subFolder;
            }
        }
    
        varCollection["User::RecentFolder"].Value = recentFolder;
    
        Dts.TaskResult = (int)ScriptResults.Success;
    }
    

    脚本任务代码(显示文件名):

    C#代码只能在 SSIS 2008及以上版本中使用。

    public void Main()
    {
        Variables varCollection = null;
    
        Dts.VariableDispenser.LockForRead("User::FilePath");
        Dts.VariableDispenser.GetVariables(ref varCollection);
    
        MessageBox.Show(varCollection["User::FilePath"].Value.ToString(), "File Path");
    
        Dts.TaskResult = (int)ScriptResults.Success;
    }
    

    屏幕截图#1:

    1

    屏幕截图#2:

    2

    屏幕截图#3:

    3

    屏幕截图#4:

    4

    屏幕截图#5:

    5

    屏幕截图#6:

    6

    屏幕截图#7:

    7

    屏幕截图#8:

    8

    屏幕截图#9:

    9

    屏幕截图#10:

    10

    屏幕截图#11:

    11

答案 1 :(得分:0)

遍历文件夹。保存第一个的名称。将该保存的值与每个后续文件夹的名称进行比较。如果下一个文件夹是更新的,请交换该名称并继续。最后,您保存的值将是最新文件夹的名称(如果您要比较创建日期,则需要同时保存文件夹名称和创建日期。)

然后,您可以将保存的值用作第二个迭代循环的参数。