将文件从一个位置复制到另一个位置并在添加时间戳后重命名它们






4.84/5 (20投票s)
一个程序,演示如何使用 Sequence Container、Foreach Loop Container、File System Task 和 Script Task 将文件从一个位置复制到另一个位置,并在添加时间戳后重命名它们
引言
最近,我们遇到了一个情况,就是需要将源文件夹中的一些文本文件复制到目标文件夹,并且需要根据时间戳重命名这些文件。这是一个非常常见的任务,在接下来的段落中,我们将探讨如何实现这一目标。在这篇文章中,我同意有很多步骤我本不必提供图示方法,但考虑到许多新的 SSIS 开发人员会喜欢一个完整的循序渐进的方法,我已将其内容完整呈现。
背景
SSIS 简化了完成非常复杂任务的方法,而这些任务在过去可能需要我们编写大量代码。本文将展示如何使用 Sequence Container、Foreach
Loop container、File System Task 和 Script Task 组件。本文所基于的示例是一个许多人都遇到过的常见任务。因此,我决定为那些尚未遇到但将在不久的将来遇到的朋友记录下它。
给定输入
源文件夹如下

预期输出
目标是将这些文件从源位置复制到目标文件夹,并根据时间戳重命名文件名。预期输出如下

要执行的步骤
步骤 1
让我们创建一个新的 BIDS 项目,并选择 Integration Services Project 作为项目模板

点击“确定”。
第二步
我们将默认包重命名为FileCopyAndRename_pkg.dtsx。

步骤 3
让我们将一个Sequence Container拖放到 Control Flow 窗口中,并在其中添加一个Foreach Loop Container。接下来,让我们在 Foreach loop container 中添加一个File System Task。此时,包设计如下

步骤 4:(配置 Foreach Loop Container)
双击 Foreach Loop container 打开 Foreach Loop Editor。

在 Collection 选项卡中找到的各种Foreach
enumerators 中,我们将仅选择Foreach File enumerator。我们还将指定源文件夹名称(在此情况下为C:\Sourcefolder),并且由于我们只处理文本文件,因此文件将按.txt扩展名进行过滤,如下所示

在变量映射部分,我们将选择<New Variable>

Add Variable 屏幕将配置如下

点击“确定”。
由于每次迭代,Foreach
enumerator 只返回一个值,因此变量的索引应映射到0
。

单击 OK 保存Foreach
container 的设置。
步骤 5:(配置 File System Task)
现在让我们通过双击 File System Task 来配置它,File System Task Editor 会打开

让我们单击DestinationConnection
。

单击<New connection…>后,File connection Manager Editor 会打开。

其中UsageType
将是 Existing folder,我们需要指定目标文件夹,在本例中为D:\DestinationFolder。单击 OK。其他更改高亮显示如下

由于我们有兴趣复制文件,因此 Operation type 已设置为 Copy File。源路径变量确实可用,因此设置为 true。最后,我们需要指定 Source Variable 名称。单击 OK。
步骤 6
此时,如果我们运行包,我们会发现文件已复制到目标文件夹(未重命名)。
但我们的目标也是在添加时间戳后重命名文件名。为此,我们将添加另一个 Sequence container,并在此其中嵌入一个 Script Task 组件。
此时包设计如下

步骤 7:(配置 Script Task Component)
双击 Script component task,Script task editor 会打开。单击 Edit Script 按钮。

并将以下代码添加到main
方法中
public void Main()
{
DirectoryInfo directoryInfo = new DirectoryInfo(@"D:\DestinationFolder");
//if the director exists then proceed
if (directoryInfo.Exists)
{
var fileList = directoryInfo.GetFiles();
foreach (FileInfo fleInfo in fileList)
{
var newFileName = GetNewFileName(fleInfo);
//copies the new file names
fleInfo.CopyTo(newFileName, true);
//delete the old/original files
fleInfo.Delete();
}
Dts.TaskResult = (int)ScriptResults.Success;
}
else
{
MessageBox.Show("Directory not found", "Invalid directory",
MessageBoxButtons.OK, MessageBoxIcon.Information);
Dts.TaskResult = (int)ScriptResults.Failure;
}
}
// Function to get the new file name
private static string GetNewFileName(FileInfo fleInfo)
{
var shortDate = DateTime.Now.ToShortDateString().Replace("/", string.Empty);
var timeInMilliSec = DateTime.Now.Millisecond.ToString();
var format = string.Format("{0}_{1}", shortDate, timeInMilliSec);
var extension = ".txt";
return Path.Combine(fleInfo.DirectoryName,
string.Concat(fleInfo.Name.Split('.')[0], "_", format, extension));
}
当然,我们需要添加对System.IO
的引用。构建代码并关闭 Script Task Editor。
步骤 8
接下来让我们运行包。它如预期般运行。

结论
希望这个小实验能帮助您理解如何使用 Sequence Container、Foreach
Loop container、File System Task 和 Script Task 组件。我们已经看到了如何配置这些组件,如何将它们协同工作。我们还看到了变量在包中的用法。我们甚至可以通过将目录名称和文件扩展名设置为变量,在运行时将其传递给 Script Task 组件。
感谢阅读。
历史
- 2011年4月28日:初始发布