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 循环容器来处理了。
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.
如果获取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’
Thanks, Jack. Works great.