Probablement, vous avez trouvé une réponse à votre question maintenant. Voici une façon possible d'y parvenir. Script Task
peut être utilisé pour trouver la liste des fichiers présents dans un chemin de dossier FTP pour un motif donné (disons *.txt
). L'exemple ci-dessous montre comment cela peut être fait.
processus étape par étape:
Sur le package SSIS, créez un FTP Connection
nommé FTP et aussi créer des variables comme le montre la capture d'écran # 1 . La variable RemotePath
contient le chemin du dossier FTP; LocalPath
contient le dossier dans lequel les fichiers seront téléchargés; FilePattern
contient le modèle de fichier pour trouver la liste des fichiers à télécharger à partir du serveur FTP; FileName
sera complétée par la Foreach loop container
mais pour éviter toute erreur de temps de conception des tâches FTP, il peut être rempli avec / ou la propriété DelayValidation
sur la tâche FTP peut être réglé sur vrai.
Sur le package SSIS, placez un Script Task
, Foreach Loop container
et FTP Task
dans le Foreach Loop container
comme indiqué dans les captures d'écran # 2 .
Remplacer la méthode Main()
dans le Script Task
avec le code dans la section de code tâche de script . La tâche de script remplira la variable ListOfFiles avec la collection de fichiers correspondant à un modèle donné. Cet exemple utilisera d'abord le modèle * .txt, qui ne donne aucun résultat, puis le modèle * .xls qui correspondra à peu de fichiers sur le serveur FTP.
Configurez le Foreach Loop container
comme indiqué dans les captures d'écran # 3 et # 4 . Cette tâche parcourra la variable ** ListOfFiles *. S'il n'y a aucun fichier, la tâche FTP dans le conteneur de boucle ne s'exécutera pas. S'il y a des fichiers, la tâche FTP dans le conteneur de la boucle s'exécutera pour la tâche pour le nombre de fichiers trouvés sur le serveur FTP.
Configurez le FTP Task
comme indiqué dans les captures d'écran # 5 et # 6 .
Screenshot # montre l'exécution du package exemple lorsque pas fichiers correspondants sont trouvés pour le modèle *.txt
.
Capture d'écran # 8 affiche le contenu du dossier C:\temp\
avant exécution du package.
Capture d'écran # montre l'exemple de l'exécution du package lorsque des fichiers correspondants sont trouvés pour le modèle *.xls
.
La capture d'écran # affiche le contenu du chemin FTP distant /Practice/Directory_New
.
Screenshot # montre le contenu du dossier C:\temp\
après exécution du package.
Capture d'écran # 12 montre la défaillance du paquet lorsqu'il est fourni avec incorrect chemin à distance.
Capture d'écran # affiche le message d'erreur relatif à l'échec du package.
Espérons que ça aide.
Script code Tâche:
C# code qui peut être utilisé dans SSIS 2008 and above
.
Incluez l'instruction using
à l'aide de System.Text.RegularExpressions;
public void Main()
{
Variables varCollection = null;
ConnectionManager ftpManager = null;
FtpClientConnection ftpConnection = null;
string[] fileNames = null;
string[] folderNames = null;
System.Collections.ArrayList listOfFiles = null;
string remotePath = string.Empty;
string filePattern = string.Empty;
Regex regexp;
int counter;
Dts.VariableDispenser.LockForWrite("User::RemotePath");
Dts.VariableDispenser.LockForWrite("User::FilePattern");
Dts.VariableDispenser.LockForWrite("User::ListOfFiles");
Dts.VariableDispenser.GetVariables(ref varCollection);
try
{
remotePath = varCollection["User::RemotePath"].Value.ToString();
filePattern = varCollection["User::FilePattern"].Value.ToString();
ftpManager = Dts.Connections["FTP"];
ftpConnection = new FtpClientConnection(ftpManager.AcquireConnection(null));
ftpConnection.Connect();
ftpConnection.SetWorkingDirectory(remotePath);
ftpConnection.GetListing(out folderNames, out fileNames);
ftpConnection.Close();
listOfFiles = new System.Collections.ArrayList();
if (fileNames != null)
{
regexp = new Regex("^" + filePattern + "$");
for (counter = 0; counter <= fileNames.GetUpperBound(0); counter++)
{
if (regexp.IsMatch(fileNames[counter]))
{
listOfFiles.Add(remotePath + fileNames[counter]);
}
}
}
varCollection["User::ListOfFiles"].Value = listOfFiles;
}
catch (Exception ex)
{
Dts.Events.FireError(-1, string.Empty, ex.ToString(), string.Empty, 0);
Dts.TaskResult = (int) ScriptResults.Failure;
}
finally
{
varCollection.Unlock();
ftpConnection = null;
ftpManager = null;
}
Dts.TaskResult = (int)ScriptResults.Success;
}
VB code qui peut être utilisé dans SSIS 2005 and above
.
Incluez l'instruction Imports
Imports System.Text.RegularExpressions
Public Sub Main()
Dim varCollection As Variables = Nothing
Dim ftpManager As ConnectionManager = Nothing
Dim ftpConnection As FtpClientConnection = Nothing
Dim fileNames() As String = Nothing
Dim folderNames() As String = Nothing
Dim listOfFiles As Collections.ArrayList
Dim remotePath As String = String.Empty
Dim filePattern As String = String.Empty
Dim regexp As Regex
Dim counter As Integer
Dts.VariableDispenser.LockForRead("User::RemotePath")
Dts.VariableDispenser.LockForRead("User::FilePattern")
Dts.VariableDispenser.LockForWrite("User::ListOfFiles")
Dts.VariableDispenser.GetVariables(varCollection)
Try
remotePath = varCollection("User::RemotePath").Value.ToString()
filePattern = varCollection("User::FilePattern").Value.ToString()
ftpManager = Dts.Connections("FTP")
ftpConnection = New FtpClientConnection(ftpManager.AcquireConnection(Nothing))
ftpConnection.Connect()
ftpConnection.SetWorkingDirectory(remotePath)
ftpConnection.GetListing(folderNames, fileNames)
ftpConnection.Close()
listOfFiles = New Collections.ArrayList()
If fileNames IsNot Nothing Then
regexp = New Regex("^" & filePattern & "$")
For counter = 0 To fileNames.GetUpperBound(0)
If regexp.IsMatch(fileNames(counter)) Then
listOfFiles.Add(remotePath & fileNames(counter))
End If
Next counter
End If
varCollection("User::ListOfFiles").Value = listOfFiles
Dts.TaskResult = ScriptResults.Success
Catch ex As Exception
Dts.Events.FireError(-1, String.Empty, ex.ToString(), String.Empty, 0)
Dts.TaskResult = ScriptResults.Failure
Finally
varCollection.Unlock()
ftpConnection = Nothing
ftpManager = Nothing
End Try
Dts.TaskResult = ScriptResults.Success
End Sub
écran # 1:
écran # 2:
Sc reenshot # 3:
écran # 4:
écran # 5:
écran # 6:
écran # 7:
écran # 8:
écran # 9:
écran # 10:
écran # 11:
Capture d'écran # 12:
Capture d'écran # 13: