MSSQL的SSIS中获取FTP文件列表的方法

MSSQL 2005 的SSIS里提供的FTP包括以下功能:
Send files 上传文件
Receive files 接收文件
Create local directory 创建本地目录
Create remote directory 创建远程目录
Remove local directory 删除本地目录
Remove remote directory 删除远程目录
Delete local files 删除本地文件
Delete remote files 删除远程文件

没有可以用于列表、下载所有FTP服务器上文件的功能。

SSIS中的 Foreach Loop Container 功能只适用本地目录、文件,无法处理FTP服务器上的目录和文件。

我们可以通过 Script task 脚本功能来实现FTP远程文件处理。下面的SSIS脚本演示获取远程FTP的所有 Demo*.xls 文件,然后下载这些文件,并在FTP服务器上删除所有已下载的文件。

其中 SetWorkingDirectory 可以用于指定FTP上的工作目录。

    Public Sub Main()
        Dim result As Integer
        Dim conMan As ConnectionManager
        Dim ftp_client As FtpClientConnection
        Dim sFolderNames() As String
        Dim sFileNames() As String
        Dim sFileName(0) As String

        conMan = Dts.Connections("MyFTP")
        ftp_client = New FtpClientConnection(conMan.AcquireConnection(Nothing))

        ftp_client.Connect()
        ftp_client.SetWorkingDirectory("incoming")
        ftp_client.GetListing(sFolderNames, sFileNames)

        For Each fileName As String In sFileNames
            sFileName(0) = fileName
            If fileName.EndsWith("xls", StringComparison.OrdinalIgnoreCase) And fileName.StartsWith("Demo", StringComparison.OrdinalIgnoreCase) Then
                ftp_client.ReceiveFiles(sFileName, "D:\Test\ftp_data\", True, False)
                ftp_client.DeleteFiles(sFileName)
            End If
        Next fileName

        ftp_client.Close()

        Dts.TaskResult = Dts.Results.Success
    End Sub

现在所有需要的文件都传到本地目录,就可以使用 Foreach Loop Container 循环容器来处理了。

3 thoughts on “MSSQL的SSIS中获取FTP文件列表的方法

  • 星期三 四月 13th, 2011 at 10:24
    Permalink

    Thank you so much for this script. It works great for my project. I was actually downloading everything even files that I didnt need and then looping the files. But now I only download what I want with the STARTS WITH command. Thanks again.

    Reply
  • 星期三 八月 22nd, 2012 at 23:40
    Permalink

    如果获取SQLServer服务器上的文件列表
    使用
    SQLDMO.QueryResults qRs = oServer.EnumAvailableMedia
    (SQLDMO.SQLDMO_MEDIA_TYPE.SQLDMOMedia_FixedDisk);
    可以获取SQLServer上的可用磁盘列表
    使用
    SQLDMO.QueryResults qRs = oServer.EnumDirectories(currentPath);
    可以获得子目录列表
    可是如何获取某个目录下的文件列表

    exec master..xp_cmdshell ‘dir “D:\Program Files”‘
    exec master..xp_subdirs ‘d:\program files’
    exec master..xp_dirtree ‘d:\program files’

    Reply
  • 星期日 七月 21st, 2013 at 01:19
    Permalink

    Thanks, Jack. Works great.

    Reply

发表评论

电子邮件地址不会被公开。 必填项已用*标注