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

问题描述 投票:1回答:2

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

脚本如下:

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

我想在上传之前验证文件。验证如下:如果文件存在并获取excel文件的记录计数。请有人帮我这个。

ssis winscp
2个回答
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


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();
}
© www.soinside.com 2019 - 2024. All rights reserved.