2017-06-15 10 views
1

私は簡単なFTPアップローダを持っています(自分自身のコードではなく、まだ学習しています) バイナリリーダーではないため、exeファイルが破損しています。しかし、混乱しているのは私がバイナリを使用するように指示していることです。FTP FtpWebRequestアップローダはexeファイルを破損します

これは私のコードです:

private void UploadFileToFTP(string source) 
{ 
    String sourcefilepath = textBox5.Text; 
    String ftpurl = textBox3.Text; // e.g. ftp://serverip/foldername/foldername 
    String ftpusername = textBox1.Text; // e.g. username 
    String ftppassword = textBox2.Text; // e.g. password 

    try 
    { 
     string filename = Path.GetFileName(source); 
     string ftpfullpath = ftpurl + "/" + new FileInfo(filename).Name; 
     FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(ftpfullpath); 
     ftp.Credentials = new NetworkCredential(ftpusername, ftppassword); 

     ftp.KeepAlive = true; 
     ftp.UseBinary = true; 
     ftp.Method = WebRequestMethods.Ftp.UploadFile; 

     FileStream fs = File.OpenRead(source); 
     byte[] buffer = new byte[fs.Length]; 
     fs.Read(buffer, 0, buffer.Length); 
     fs.Close(); 

     Stream ftpstream = ftp.GetRequestStream(); 
     ftpstream.Write(buffer, 0, buffer.Length); 
     ftpstream.Close(); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 
+0

それはうまく動作していますが、exeファイルが壊れているという意味ですか?ファイルが壊れているとどうすれば正常に動作しますか? –

+0

アップロードの実際の機能はほとんどのファイルタイプで機能するためです。 .exesとは別に –

+0

エンコードの問題のような音です。おそらく、OpenRead()はエンコーディングにファンキーな何かをします。下の私の例を試してください。私はEXEでそれをテストしたところ、正常に動作しました。 – Cory

答えて

0

ないあなたが持っているものを発行してください。

このコードは私のためだけで正常に動作:

String sourcefilepath = ""; 
String ftpurl = ""; // e.g. ftp://serverip/foldername/foldername 
String ftpusername = ""; // e.g. username 
String ftppassword = ""; // e.g. password 
var filePath = ""; 
try 
{ 
    string filename = Path.GetFileName(sourcefilepath); 
    string ftpfullpath = ftpurl + "/" + new FileInfo(filename).Name; 
    FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(ftpfullpath); 
    ftp.Credentials = new NetworkCredential(ftpusername, ftppassword); 

    ftp.KeepAlive = true; 
    ftp.UseBinary = true; 
    ftp.Method = WebRequestMethods.Ftp.UploadFile; 

    byte[] buffer = File.ReadAllBytes(sourcefilepath); 

    ftp.ContentLength = buffer.Length; 

    Stream ftpstream = ftp.GetRequestStream(); 
    ftpstream.Write(buffer, 0, buffer.Length); 
    ftpstream.Close(); 
} 
catch (Exception ex) 
{ 
    throw ex; 
} 
+0

私はこれを使用しましたが、それでも動作します。ありがとう、おいしい男: バイト[]バッファ=新しいバイト[fs.Length]; fs.Read(buffer、0、buffer.Length); ftp.ContentLength = fs.Length; fs.Close(); –

+0

厄介な..:| 。私はそれを知らなかった。リンクありがとう。 – Cory

2

Stream.Readは、あなたが要求したすべてのバイトを読み取るために、あなたを保証するものではありません。

具体FileStream.Read documentationは言う:

数:読み込むバイト最大数を。
戻り値:バッファに読み込まれた合計バイト数。このは、そのバイト数が現在利用できない場合は要求されたバイト数よりも少なく、ストリームの終わりに達した場合はゼロよりも小さいかもしれません()。


メモリにファイル全体を読み取るために、使用File.ReadAllBytes

byte[] buffer = File.ReadAllBytes(source); 

あなたが実際にメモリに完全に巨大なファイルを格納避けるために、Stream.CopyToを使用する必要がありますが:何

fs.CopyTo(ftp.GetRequestStream()); 
関連する問題