我是WinSCP的新手,并在使用WinSCP和SSIS作业进行验证后尝试上载文件。 SSIS作业将调用此脚本,该脚本需要验证并上传文件。
脚本为:
open Sftp://Username:password@ftplogin
option transfer binary
put -delete C:\Temp\testingfile.xlsx /Destinationfolder/
close
exit
我正在尝试在上传之前验证文件。验证方式为:如果文件存在并获取excel文件的记录数。 谁能帮我这个忙。
答案 0 :(得分:1)
对于将WinSCP与SSIS一起使用,我建议使用脚本任务。要了解有关此内容的更多信息,请访问他们的website,其中也包含下载链接。尽管WinSCP确实提供了验证文件属性的方法,但我发现LINQ更为有益,因此以下内容使用Where
方法进行过滤。下面的示例使用String.StartsWith
属性上的Name
方法验证文件名的开头,该方法仅包含文件名,而不包含完整路径。使用String.EndsWith
方法确认扩展名。如果两个都返回true,则将文件路径放置在列表中,并使用Session.GetFiles
方法进行传输。之后,为文件定义了一个excel Workbook
,其Count
属性获得了电子表格中的行数,在本示例中使用了第一个电子表格。您可能还需要加载到WinSCP程序集。如果确实遇到与此相关的错误,则可以使用ResolveEventHandler
委托来加载它,如下所示。发送到LoadFile
方法的路径将是WinSCPnet
dll的下载位置。
using System.Linq;
using WinSCP;
using System.Collections.Generic;
//load WinSCPnet.dll
static ScriptMain()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name.ToUpper().Contains("WINSCPNET"))
{
string path = @"C:\WinSCP Download Path\";
return System.Reflection.Assembly.LoadFile(System.IO.Path.Combine(path, "WinSCPnet.dll"));
}
return null;
}
public void Main()
{
SessionOptions sessOpt = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = "SFTPsite.com",
UserName = "user",
Password = "password",
SshHostKeyFingerprint = "Your SshHostKeyFingerprint"
};
using (Session session = new Session())
{
session.Open(sessOpt);
TransferOptions transferOptions = new TransferOptions();
transferOptions.TransferMode = TransferMode.Binary;
int excelRecordCount = 0;
string remotePath = @"/SFTP Folder/";
string localPath = @"C:\Local Folder\";
Microsoft.Office.Interop.Excel.Application exlApp = new Microsoft.Office.Interop.Excel.Application();
RemoteDirectoryInfo rdi = session.ListDirectory(remotePath);
//verify file existence by matching beginning of name and extension
List<string> fileList = rdi.Files.Where(file => (file.Name.StartsWith("Prefix"))
&& (file.FullName.EndsWith(".xlsx"))).Select(file => file.FullName).ToList();
foreach (string s in fileList)
{
//transfer matching files
session.GetFiles(s, localPath, false, transferOptions);
//get excel file name by combining local path and name of transferred file
Microsoft.Office.Interop.Excel.Workbook exlWorkbook = exlApp.Workbooks.Open(localPath +
s.Substring(s.LastIndexOf(@"/"), s.Length - s.LastIndexOf(@"/")));
Microsoft.Office.Interop.Excel.Worksheet exlWorksheet = exlWorkbook.Sheets[1];
Microsoft.Office.Interop.Excel.Range excelRange = exlWorksheet.UsedRange;
//get row count
excelRecordCount = excelRange.Rows.Count;
}
//close excel file
exlWorkbook = null;
xlApp.Quit();
xlApp = null;
}
GC.Collect();
GC.WaitForPendingFinalizers();
}
答案 1 :(得分:1)
如果在使用SSIS验证后要使用WinSCP来移动文件,则可以使用脚本任务组件来执行此操作。这里的好处是WinSCP已经提供了脚本任务中执行此操作的代码(请参见下面的参考)。注意:您将需要下载WinSCPNet.dll程序集并将其安装到全局程序集缓存(GAC)。
参考:
SSIS脚本任务设置:https://winscp.net/eng/docs/guide_ssis#ssis_ssdt_task
脚本任务C#代码:https://winscp.net/eng/docs/library_ssis
WinSCPNet.dll程序集:https://winscp.net/eng/docs/library_install