从FTP获取文件大小(在SSIS中,使用Dts.Connections)

时间:2017-05-05 18:39:03

标签: c# ssis ftp ssis-2012

我在将大文件发送到FTP站点时遇到问题,我想在传输后检查文件大小(有时它有时会失败)。转移是在SSIS内,我使用C#中的Dts.Connections。

我的代码:

public long TransferFile(string file)
{
    long filesize = 0L;

    try
    {
        string[] newfile = new[] { file };

        ConnectionManager ftpCM = Dts.Connections["ftp_server"];
        string remoteDir = Dts.Variables["FtpWorkingDirectory"].Value.ToString();

        FtpClientConnection ftpClient = new FtpClientConnection(ftpCM.AcquireConnection(null));
        ftpClient.UsePassiveMode = true;
        ftpClient.Connect();
        ftpClient.Retries = 10;
        ftpClient.SetWorkingDirectory(remoteDir);

        ftpClient.SendFiles(newfile, remoteDir, true, false);

        ftpClient.Close();
    }
    catch (Exception ex)
    {
        throw ex;
    }

    return filesize;
}

我找到了使用FtpWebRequest的示例,但我没有使用ftp uri,所以我不知道如何使用这种方法。如何获得此文件大小?

更新: 添加这个:

        FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpCM.ConnectionString + remoteDir + "/" + file));
        request.Proxy = null;

        DtsProperty ServerUsername = ftpCM.Properties["ServerUserName"];
        DtsProperty ServerPassword = ftpCM.Properties["ServerPassword"];
        request.Credentials = new NetworkCredential(ServerUsername.GetValue(ftpCM).ToString(), ServerPassword.GetValue(ftpCM).ToString());
        request.Method = WebRequestMethods.Ftp.GetFileSize;

        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        filesize = response.ContentLength;
        response.Close();

我收到错误:属性ServerPassword是只写的。

1 个答案:

答案 0 :(得分:0)

最终的解决方案是将用户名和密码存储在变量而不是连接参数中。

使用以下代码:

boolean isList1Empty = CollectionUtils.isEmpty(list1);
boolean isList2Empty = CollectionUtils.isEmpty(list2);

if (isList1Empty && isList2Empty) {
    return true;
}
// One is empty, but the other was not, then they are not equal!
else if (isList1Empty || isList2Empty)
    return false;
}
// check size
else if (list1.size() != list2.size()) {
    return false;
}
return true;