Foreach 文件枚举器不返回目录。直到我开始回答这个问题,我才意识到这一点。
设置
我在基本文件夹下创建了一系列文件夹和文件,就像你指出的那样
C:\SSISData\31081157
C:\SSISData\31081157\Subfolder1
C:\SSISData\31081157\Subfolder2
C:\SSISData\31081157\Subfolder1\file1.txt
C:\SSISData\31081157\Subfolder1\file2.txt
C:\SSISData\31081157\Subfolder1\file3.txt
C:\SSISData\31081157\Subfolder2\file4.txt
C:\SSISData\31081157\Subfolder2\file5.txt
C:\SSISData\31081157\Subfolder2\file6.txt
我用 4 个变量构建了一个包
- CurrentFile - 字符串 - 值无关紧要
- CurrentFolder - 字符串 - 值无关紧要
- FolderBase - 字符串 - 将此值设置为 base/root/parent 文件夹以进行处理
- 子文件夹列表 - 对象
第一轮
我最初的构建看起来像
FELC 工艺文件夹
我使用@[User::FolderBase] 的目录来设置它,并且未选中遍历子文件夹。我的变量映射选项卡使用 User::CurrentFolder 作为索引 0
FELC 处理文件
我使用 @[User::CurrentFolder] 的目录设置它,我的变量映射选项卡使用 User::CurrentFile 作为索引 0
SCR 发射
这是一个脚本任务,它接受两个只读参数:UserFolder 和 UserBase。我只是通过引发 OnInformation 事件(显示在您的“进度”选项卡中)来使用它来显示当前值。
- ReadOnlyVariables:User::CurrentFile,User::CurrentFolder
- ReadWriteVariables:
代码很简单
public void Main()
{
bool fireAgain = false;
string folderName = this.Dts.Variables["User::CurrentFolder"].Value.ToString();
string fileName = this.Dts.Variables["User::CurrentFile"].Value.ToString();
string message = string.Format("Folder = {0} : File = {1}", folderName, fileName);
Dts.Events.FireInformation(0, "Emit", message, string.Empty, 0, ref fireAgain);
Dts.TaskResult = (int)ScriptResults.Success;
}
但它永远不会触发内部 foreach 循环,因为外部循环中没有文件。哎呀
第二轮
这可能是我首先解决这个问题的方法。
我没有先找出所有目录,而是简单地遍历树,然后找出我在哪里。
FELC 子文件夹
我使用@[User::FolderBase] 的目录设置它,并检查左遍历子文件夹。我的变量映射选项卡使用 User::CurrentFile 作为索引 0
SCR 分配当前文件夹
这是一个脚本,它将使用 .NET 库来查找 containing folder
- ReadOnlyVariables: User::CurrentFile
- ReadWriteVariables: User::CurrentFolder
代码保持简单
public void Main()
{
string currentFile = this.Dts.Variables["User::CurrentFile"].Value.ToString();
string parent = System.IO.Directory.GetParent(currentFile).FullName;
this.Dts.Variables["User::CurrentFolder"].Value = parent;
Dts.TaskResult = (int)ScriptResults.Success;
}
SCR 发射
同上
第三轮
这假设您在深入了解该文件夹之前必须知道该文件夹。在这种情况下,我们将再次返回 .NET 库来检查文件系统,但现在我们将使用子文件夹列表填充最后一个变量 User::SubFolderList。从技术上讲,它是一个字符串数组,但没关系。
SCR 生成子文件夹列表
使用 Directory.GetDirectories 中的静态方法返回文件夹列表的脚本任务。
- ReadOnlyVariables: User::FolderBase
- ReadWriteVariables: User::SubFolderList
代码也很简单
public void Main()
{
string folder = this.Dts.Variables["User::FolderBase"].Value.ToString();
this.Dts.Variables["User::SubFolderList"].Value = System.IO.Directory.GetDirectories(folder);
Dts.TaskResult = (int)ScriptResults.Success;
}
FELC 处理子文件夹列表
这是一个 Foreach 枚举器,但我们必须将文件类型从文件列表设置为 Foreach From Variable Enumerator。作为您的变量,您将使用@[User::SubFolderList]。我的变量映射选项卡使用 User::CurrentFolder 作为索引 0
当前文件夹中的 FELC 处理文件
既然我们知道 CurrentFolder 是什么,那么我们将使用 Foreach 文件枚举器并指定 @[User::CurrentFolder] 的目录。我将变量映射选项卡设置为使用 User::CurrentFile 作为索引 0
SCR 发射
同上
结果
如您所见,我使用方法 2 和 3 得到相同的结果。这仅取决于对您的特定用例更有意义的方法。