我是WinSCP的新手,尝试使用WinSCP和SSIS作业验证后上传文件。 SSIS作业将调用此脚本,此脚本需要验证并上载文件。
脚本如下:
open Sftp://Username:password@ftplogin
option transfer binary
put -delete C:\Temp\testingfile.xlsx /Destinationfolder/
close
exit
我想在上传之前验证文件。验证如下:如果文件存在并获取excel文件的记录计数。请有人帮我这个。
如果要在使用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
为了将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();
}