2011-10-28 15 views
0

私はいくつかのファイルをFTPからダウンロードし、それらを解凍して同じFTPの場所に再度アップロードするプログラムを作成しようとしています。FTPダウンロード/アップロードエラー504

私はファイルをダウンロードしようとしました。失敗した場合は、再度試みます。

エラーが発生しない場合は、すべてのファイルがダウンロードされ、アップロードされます。

ダウンロード中にエラーが発生した場合、再試行でエラーがダウンロードされますが、アップロードに失敗します。

私は問題が接続を正しく閉じることができないと思っていますが、私の人生にとってはそれを理解できません。

ここに私のコードです。それが失敗したところ私が追加しました:

アップロード:

FileInfo fileInf = new FileInfo("directory" + zip + ".zip"); 
string uri = "ftp://address" + fileInf.Name; 
FtpWebRequest reqFTP2; 
reqFTP2 = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://address" + fileInf.Name)); 
reqFTP2.Credentials = new NetworkCredential("username", "password"); 
reqFTP2.KeepAlive = true; 
reqFTP2.Method = WebRequestMethods.Ftp.UploadFile; 
reqFTP2.UseBinary = true; 
reqFTP2.ContentLength = fileInf.Length; 
int buffLength = 2048; 
byte[] buff = new byte[buffLength]; 
int contentLen; 
FileStream fs = fileInf.OpenRead(); 
try 
{ 
    Stream strm = reqFTP2.GetRequestStream(); //FAILS HERE 
    contentLen = fs.Read(buff, 0, buffLength); 
    while (contentLen != 0) 
    { 
     strm.Write(buff, 0, contentLen); 
     contentLen = fs.Read(buff, 0, buffLength); 
    } 
    strm.Close(); 
    fs.Close(); 

} 
catch (Exception ex) 
{ 

} 

ダウンロード:手始めに

int errorOccured = 0; 
while (errorOccured < 1) 
{ 
    FileStream outputStream = new FileStream("directory\\" + file, FileMode.Create); 
    FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://address/" + file)); 
    reqFTP.Credentials = new NetworkCredential("username", "password"); 
    try 
    { 
     reqFTP.Method = WebRequestMethods.Ftp.DownloadFile; 
     reqFTP.UseBinary = true; 
     FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 
     Stream ftpStream = response.GetResponseStream(); 
     long cl = response.ContentLength; 
     int bufferSize = 2048; 
     int readCount; 
     byte[] buffer = new byte[bufferSize]; 
     readCount = ftpStream.Read(buffer, 0, bufferSize); 
     while (readCount > 0) 
     { 
      outputStream.Write(buffer, 0, readCount); 
      readCount = ftpStream.Read(buffer, 0, bufferSize); 
     } 
     ftpStream.Close(); 
     outputStream.Close(); 
     response.Close(); 
     errorOccured++; 
    } 
    catch (Exception er) 
    { 
     outputStream.Close(); 
    } 
+0

どのような例外がありますか? –

+0

System.Net.WebException:リモートサーバーがエラーを返しました:(503)コマンドの順序が正しくありません。 System.Net.FtpWebRequest.RequestCallback System.Net.CommandStream.AbortでSystem.Net.CommandStream.InvokeRequestCallbackで(オブジェクトobj) (オブジェクトobj) (例外でSystem.Net.FtpWebRequest.SyncRequestCallback(オブジェクトOBJ)で e) at System.Net.FtpWebRequest.FinishRequestStage(RequestStageステージ) at System.Net.FtpWebRequest.GetRequestStream() RightMove.Form1.uploadFTP(String zip)(C:\ Users \ dir \ Form1.cs:line) 407 – BenG

答えて

0

、それらが適切に配置されるようにusingブロックであなたのストリームをラップします。

詳細については、MSDNを参照してください。

1

The error 504 – Command not implemented for that parameter.

は、そこで使用しているオプションの一部がターゲットFTPサーバーによって実装されていないことを示しています。私はあなたのコードが奇妙な要求を引き起こしていると思います。あなたのプロセスがサーバー側で作成するFTPチャッターを見ることをお勧めします。例として、サーバーはPASVモードをサポートしていますか? ACTVモード(デフォルト動作)のFTPプロトコルは、明示的にクライアントにポート20の「ファイル受信ポート」を開いて聞かせるため、常に痛みを伴います。ほとんどのサーバーはPASVモード転送をサポートしていますが、明示的にPASVモードに設定しないと苦労することがあります。チャットを見て、サーバーがPASVモードになっているかどうかを確認し、問題が解決しない場合は、チャットを見て、FTPネゴシエーション中に "余分なスペース"が渡されているかどうかを確認します。 FTPはかなり厄介で、いくつかの落とし穴があります。 :-)

関連する問題