2010-11-11 50 views
4

我在使用下面的代碼重新命名一個FTP文件的問題:僅在.NET Framework 4.0中的FTP服務器上重命名文件時出現問題!

Dim Request As FtpWebRequest = DirectCast(WebRequest.Create(New Uri("ftp://sftp.mycompany.com/myfile.txt")), FtpWebRequest) 
    'Set that we will be renaming a file 
    Request.Method = WebRequestMethods.Ftp.Rename 
    'Provide the new filename 
    Request.RenameTo = NewFileName 
    'The credentials needed to log onto the server 
    Request.Credentials = New NetworkCredential("username", "password") 
    'We are going to enable SSL for the communication with the FTP server as required by the remote server. 
    Request.EnableSsl = True 
    Request.UsePassive = True 
    Request.KeepAlive = False 
    'Create a Response object getting the downloaded file 
    Dim Response As FtpWebResponse = DirectCast(Request.GetResponse(), FtpWebResponse) 
    Response.Close() 

我從來沒有真正有它的工作或需要重新命名一個FTP文件到.NET 4.0所以這是第一次代碼我寫的。關閉此代碼以下載文件WORKS,以便它不是SSL或FTP問題(請參閱跟蹤詳細信息)顯然儘管此代碼被記錄爲可在Framework 3.5或更高版本中使用。在VS.NET 2010 .NET Framework 4.0項目中,我總是回頭:「遠程服務器返回一個錯誤:(550)文件不可用(例如文件未找到,無法訪問)」。

猜猜是什麼......將確切的代碼複製到舊的VS.NET 2008測試項目中再次運行 - >完美運行!

所以我想我只是把這個代碼包裝在一個以3.5框架爲目標的二進制文件中,然後在我的VS.NET 2010項目中引用它來取代錯誤,但它沒有奏效。

我試着添加一個解決方法,我發現聲明爲文件名添加前綴「%2E /」對我無效。我跟蹤日誌保持輸出相同的結果:

System.Net信息:0:[2228] FtpControlStream#15409429 - 收到的響應[257 「/用戶/企業」 是當前目錄]
System.Net信息:0: [2228] FtpControlStream#15409429 - 發送命令[RNFR /myfile.txt]
System.Net信息0:[2228] FtpControlStream#15409429 - 接收到的響應[550文件/myfile.txt未找到]

VS.NET 2008在重命名文件之前有不同的結果省略第一個斜槓:

System.Net信息:0:[6460] FtpControlStream#40715158 - 接收到的響應[257「/ users/company」是當前目錄]
System.Net信息:0:FtpControlStream#40715158 - 發送命令[CWD /用戶/公司/]
System.Net信息:0:[6460] FtpControlStream#40715158 - 接收到的響應[250命令CWD成功]
System.Net信息:0:FtpControlStream#40715158 - 發送命令[ RNFR的myfile.txt]
System.Net信息:0:[6460] FtpControlStream#40715158 - 收到的響應[350輸入新的名稱]
System.Net信息:0:[6460] FtpControlStream#40715158 - 發送命令[RNTO myfileOLD.txt]
System.Net信息:0:[6460] FtpControlStream#40715158 - 收到的響應[250改名]

我想盡組合並不能得到這個工作,除了在VS.NET 2008或之前運行時。這聽起來像一個錯誤或無證的程序更改,可能會保證connect.microsoft.com上的條目。

對此有何幫助或建議?

謝謝!

回答

1

好的我有一個工作。正如你所看到的VS.NET 2008版本也發出改變目錄命令:「CWD /用戶/公司/」是而不是在VS.NET 2010版本中出現。該無證(從我讀至少),但可行的解決方案是使用/%2F轉義字符在請求URI只有登錄到服務器時被解析爲當前目錄下的文件夾之間。本質上,我必須明確並給出絕對路徑,僅在默認文件夾位置之間使用這些特殊轉義字符。代碼的新的URL請求線低於如下:

Dim Request As FtpWebRequest = DirectCast(WebRequest.Create(New Uri("ftp://sftp.mycompany.com/%2fusers/%2fcompany/myfile.txt")), FtpWebRequest) 

我認爲這可能只是會爲那些你登錄到FTP服務器,在那裏你會被自動解析到一個默認的目錄,就會出現一個問題,甚至可能不會在請求URI中提供該目錄。

+0

我已經加入了微軟連接錯誤報告在這個問題上,他們確實做回那個迴應是有人用下面的語句的問題:「感謝您報告此問題,我們將計劃在未來的版本中解決這一問題。 「現在狀態已移至「固​​定」。這裏是鏈接:https://connect.microsoft.com/VisualStudio/feedback/details/621450/problem-renaming-file-on-ftp-server-using-ftpwebrequest-in-net-framework-4-0-vs2010 -只要 – atconway 2010-12-14 14:28:36

2

上述答案是不是爲我工作。 也沒有這些工作對我來說:

在我的情況確實發生了什麼事是,我想我的文件的完整路徑移到加入到舊路徑就好像是從文件當前位置的相對位置。 例如我有一個文件在ftp://127.0.0.1/usr/john/temp/file.fmf,我想將它移動到ftp://127.0.0.1/usr/mary/archive/file.fmf。我使用(並且這工作在.Net Framework 3.5和之前):

 FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://127.0.0.1/usr/john/temp/file.fmf")); 
     ftp.Credentials = new NetworkCredential(this.UserName, this.Password); 
     ftp.KeepAlive = true; 
     ftp.UsePassive = true; 
     ftp.Method = WebRequestMethods.Ftp.Rename; 

     ftp.RenameTo = "usr/mary/archive/file.fmf"; 

     ftp.UseBinary = true; 
     FtpWebResponse response = (FtpWebResponse)ftp.GetResponse(); 

但是不在.Net Framework 4.0中。 在System.Net跟蹤中,我發現我試圖將該文件替換爲usr/john/temp/usr/mary/archive/file.fmf。這個位置確實不存在。所以我把RenameTo改成了相對路徑:

 ftp.RenameTo = "../../mary/archive/file.fmf"; 

再次,文件被移動到它的新位置。

雖然我周圍看到這僅僅是工作,而不是解決辦法,雖然我不知道要真正解決這個問題,我很高興它再次工作。

3

我看到這句話在forum

If the URI is of the form "ftp://contoso.com/%2fpath" (%2f is an escaped '/'), then the URI is absolute, and the current directory is /path.'

我有這樣的事情:

Dim _request As FtpWebRequest = DirectCast(WebRequest.Create(New Uri("ftp://xxx.xxx.xxx.xx/%2fremotedirectory/filename.txt")), FtpWebRequest) 

我想將文件移動到remotedirectory/archive/filename.txt

所以一旦我做了FTP請求我在remoteirectory目錄,所以我能夠完成我的目標:

_request.RenameTo = "/archive/filename.txt" 

,我不再得到550錯誤。

相關問題