Для чего-то подобного я бы порекомендовал использовать задачу «Сценарий» со сборкой WinSCP .NET, которая позволит вам использовать функциональность C # для проверки даты в файле перед передачей. Пример этого процесса ниже. Поскольку вы сохраняете начало имени файла (включая дату) в переменной, в свойстве Name
используется метод String.StartsWith
, поскольку он возвращает только имя файла без пути к папке. Метод String.EndsWith
также используется для сопоставления только CSV-файлов, как указано в вашем посте. Переменная SSIS, содержащая имя файла, должна быть добавлена в поле ReadOnlyVariables
задачи «Сценарий», а также переменные, содержащие пути к папкам, если вы их так храните. Если вы столкнулись с ошибкой, связанной с загрузкой сборки WinSCP, для ее решения можно использовать делегат ResolveEventHandler
, как показано ниже. Расположение, в которое была загружена библиотека WinSCP, - это путь, отправленный методу LoadFile
. Хотя похоже, что вы ожидаете только один файл в день, список используется в том случае, если в один день будет несколько файлов.
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()
{
//get file name and local/remote paths from SSIS variables.
string fileDateName = Dts.Variables[“User::FileDateName”].Value.ToString();
string remotePath = Dts.Variables[“User::RemoteFilePath”].Value.ToString();
string localPath = Dts.Variables[“User::LocalFilePath”].Value.ToString();
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;
RemoteDirectoryInfo rdi = session.ListDirectory(remotePath);
//confirm beginning of file name and extension
List<string> fileList = rdi.Files.Where(file => (file.Name.StartsWith(fileDateName))
&& (file.FullName.EndsWith(".csv"))).Select(file => file.FullName).ToList();
foreach (string s in fileList)
{
//transfer files
session.GetFiles(s, localPath, false, transferOptions);
}
}
}