65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (20投票s)

2011年4月28日

CPOL

4分钟阅读

viewsIcon

186172

downloadIcon

3271

一个程序,演示如何使用 Sequence Container、Foreach Loop Container、File System Task 和 Script Task 将文件从一个位置复制到另一个位置,并在添加时间戳后重命名它们

引言

最近,我们遇到了一个情况,就是需要将源文件夹中的一些文本文件复制到目标文件夹,并且需要根据时间戳重命名这些文件。这是一个非常常见的任务,在接下来的段落中,我们将探讨如何实现这一目标。在这篇文章中,我同意有很多步骤我本不必提供图示方法,但考虑到许多新的 SSIS 开发人员会喜欢一个完整的循序渐进的方法,我已将其内容完整呈现。

背景

SSIS 简化了完成非常复杂任务的方法,而这些任务在过去可能需要我们编写大量代码。本文将展示如何使用 Sequence Container、Foreach Loop container、File System Task 和 Script Task 组件。本文所基于的示例是一个许多人都遇到过的常见任务。因此,我决定为那些尚未遇到但将在不久的将来遇到的朋友记录下它。

给定输入

源文件夹如下

1.jpg

预期输出

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

2.jpg

要执行的步骤

步骤 1

让我们创建一个新的 BIDS 项目,并选择 Integration Services Project 作为项目模板

3.jpg

点击“确定”。

第二步

我们将默认包重命名为FileCopyAndRename_pkg.dtsx

4.jpg

步骤 3

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

5.jpg

步骤 4:(配置 Foreach Loop Container)

双击 Foreach Loop container 打开 Foreach Loop Editor。

6.jpg

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

7.jpg

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

8.jpg

Add Variable 屏幕将配置如下

9.jpg

点击“确定”。

由于每次迭代,Foreach enumerator 只返回一个值,因此变量的索引应映射到0

10.jpg

单击 OK 保存Foreach container 的设置。

步骤 5:(配置 File System Task)

现在让我们通过双击 File System Task 来配置它,File System Task Editor 会打开

11.jpg

让我们单击DestinationConnection

12.jpg

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

13.jpg

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

14.jpg

由于我们有兴趣复制文件,因此 Operation type 已设置为 Copy File。源路径变量确实可用,因此设置为 true。最后,我们需要指定 Source Variable 名称。单击 OK。

步骤 6

此时,如果我们运行包,我们会发现文件已复制到目标文件夹(未重命名)。

但我们的目标也是在添加时间戳后重命名文件名。为此,我们将添加另一个 Sequence container,并在此其中嵌入一个 Script Task 组件。

此时包设计如下

15.jpg

步骤 7:(配置 Script Task Component)

双击 Script component task,Script task editor 会打开。单击 Edit Script 按钮。

16.jpg

并将以下代码添加到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

接下来让我们运行包。它如预期般运行。

17.jpg

结论

希望这个小实验能帮助您理解如何使用 Sequence Container、Foreach Loop container、File System Task 和 Script Task 组件。我们已经看到了如何配置这些组件,如何将它们协同工作。我们还看到了变量在包中的用法。我们甚至可以通过将目录名称和文件扩展名设置为变量,在运行时将其传递给 Script Task 组件。

感谢阅读。

历史

  • 2011年4月28日:初始发布
© . All rights reserved.