2017-05-05 56 views
-2

我有一個問題,發送大文件到FTP站點,我想檢查傳輸後的文件大小(有時它有時會失敗)。傳輸是在一個SSIS內,我正在C#中使用Dts.Connections。從FTP獲取文件大小(在SSIS中,使用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,所以我不明白如何使用此方法。我怎樣才能得到這個文件大小?

UPDATE: 添加此:

 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只寫。

+0

的ftpCM應該是URI。 –

+0

*「我沒有ftp uri可用」* - 那是什麼意思? URL只是提供FTP連接所需的連接信息的另一種格式! - 如果你通過'request.Credentials = new NetworkCredential(...)'分別提供用戶名/密碼,就像'ftp://用戶名:密碼@主機名'或者甚至是'ftp://主機名'。 –

+0

你從哪裏得到「屬性ServerPassword是隻寫的。」? - 完全! –

回答

0

最終的解決方案是將用戶名和密碼存儲在變量中而不是連接參數中。

並與下面的代碼:

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(); 
     string ServerUsername = Dts.Variables["ServerUsername"].Value.ToString(); 
     string ServerPassword = Dts.Variables["ServerPassword"].Value.ToString(); 

     FtpClientConnection ftpClient = new FtpClientConnection(ftpCM.AcquireConnection(null)); 
     ftpClient.UsePassiveMode = true; 
     ftpClient.ServerUserName = ServerUsername; 
     ftpClient.ServerPassword = ServerPassword; 

     ftpClient.Connect(); 
     ftpClient.Retries = 10; 
     ftpClient.SetWorkingDirectory(remoteDir); 

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

     ftpClient.Close(); 

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

     request.Credentials = new NetworkCredential(ServerUsername, ServerPassword); 
     request.Method = WebRequestMethods.Ftp.GetFileSize; 

     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
     filesize = response.ContentLength; 
     response.Close(); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 

    return filesize; 
}