上传到SFTP之前无法使用WinSCP脚本验证文件

时间:2019-02-19 06:44:37

标签: ssis winscp

我是WinSCP的新手,并在使用WinSCP和SSIS作业进行验证后尝试上载文件。 SSIS作业将调用此脚本,该脚本需要验证并上传文件。

脚本为:

open Sftp://Username:password@ftplogin
option transfer binary
put -delete C:\Temp\testingfile.xlsx /Destinationfolder/
close 
exit

我正在尝试在上传之前验证文件。验证方式为:如果文件存在并获取excel文件的记录数。 谁能帮我这个忙。

2 个答案:

答案 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