2012-01-01 22 views
0

これは非常に具体的です。私は、関数がDLL内にあり、コードは以下の通りです私の私のVB.NetプログラムでC#の機能を使用して助ける必要があります。VB.NetのC#アップロード機能を使用

public void UploadData(string FTPUri, string FilePath, string FileName, 
         string UserName, string Password) 
{ 
    StatusUp = new Int64[2]; 

    reqFTP = (FtpWebRequest)FtpWebRequest.Create(FTPUri + FileName); 
    reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 
    reqFTP.UseBinary = true; 
    reqFTP.Credentials = new NetworkCredential(UserName, Password); 

    FileInfo fileInf = new FileInfo(FilePath); 

    FileStream fs = fileInf.OpenRead(); 

    // modifyied code 
    int bytesSize = 0; 
    byte[] UpBuffer = new byte[2048]; 

    ftpStream = reqFTP.GetRequestStream(); 

    bytesSize = fs.Read(UpBuffer, 0, UpBuffer.Length); 

    while ((bytesSize = fs.Read(UpBuffer, 0, UpBuffer.Length)) > 0) 
    { 
     StatusUp[0] = StatusUp[0] + UpBuffer.Length; 
     StatusUp[1] = fileInf.Length;// +startPointInt; 

     ftpStream.Write(UpBuffer, 0, bytesSize); 
    } 

    fs.Close(); 
    ftpStream.Close(); 
} 

私vb.netのプログラムでは、私はこのようにそれを呼び出しています:

Dim FtpUpload As FTPUtility.ftpUtility = New FTPUtility.ftpUtility 
FtpUpload.UploadData("ftp://ftp.xxx.xx", "C:\winzip.log", "/winzip.log", "uploader", "xxxx") 

完了したら2バイト短いという点を除いて問題なく動作します。私はC#コードが間違っているかどうかを知るには十分なC#を知りませんが(私はそれを書いておらず、会社を辞めた人もいますが)、どこかにファイルや何かが閉じていないようです。

アイデア?

+1

どうやらあなたはC++から離れているとはっきりと分かりません; - ] – ildjarn

+0

私には正しいと思われます。それは常に2バイト短いですか?それはすべてのファイルで起こりますか? –

+0

ハハ! :-)はい、今私は信じられないほど馬鹿に見えます。あなたは正しいです、それはC#です - 私は同じ男のC++コードを一日中見ていたので段階的に終了しました。とにかく、ありがとう! – Chiwda

答えて

1
bytesSize = fs.Read(UpBuffer, 0, UpBuffer.Length); 

while ((bytesSize = fs.Read(UpBuffer, 0, UpBuffer.Length)) > 0) 
{ 
    StatusUp[0] = StatusUp[0] + UpBuffer.Length; 
    // etc.. 
} 

2つの赤い旗を動作するかどう受け入れを使用して変換しました。最初の問題はあなたの問題の原因です。whileループに入る前に余分なfs.Read()呼び出しがあります。これは、あなたが使用していない、アップロードしない2048バイトです。その行を削除するだけです。 for(;;)とbreakを使用することで、この種のバグを回避できます。

StatusUp [0]の割り当てが悪く見えるので、UpBuffer.LengthではなくbytesSizeを追加する必要があります。そうでなければ、副作用が何であるかは明らかではありません。

+0

Thanx!それはそれのように見える!私は明日それを試して、あなたに知らせる必要があります。 – Chiwda

+0

ところで、パーセンテージやプログレスバーを表示するために上記のStatusUpをどのように使用すればよいと思いますか? Thanx! – Chiwda

+0

それは正しい推測でした。 ProgressBar.Value =(int)(100L * StatusUp [0]/StatusUp [1]);明らかに、より良い名前を使うことができます。 –

0

It C#、C++ではありません。

http://www.developerfusion.com/tools/convert/csharp-to-vb/

Public Sub UploadData(FTPUri As String, FilePath As String, FileName As String, UserName As String, Password As String) 
    'FtpWebRequest reqFTP; 
    StatusUp = New Int64(1) {} 

    reqFTP = DirectCast(FtpWebRequest.Create(FTPUri & FileName), FtpWebRequest) 
    reqFTP.Method = WebRequestMethods.Ftp.UploadFile 
    reqFTP.UseBinary = True 
    reqFTP.Credentials = New NetworkCredential(UserName, Password) 
    'StreamReader ReadStream = new StreamReader(FilePath); 
    Dim fileInf As New FileInfo(FilePath) 

    Dim fs As FileStream = fileInf.OpenRead() 

    ' modifyied code 
    Dim bytesSize As Integer = 0 
    Dim UpBuffer As Byte() = New Byte(2047) {} 

    'reqFTP.ContentLength = ftpResponse.Length; 
    'Stream ftpStream = reqFTP.GetRequestStream(); 
    ftpStream = reqFTP.GetRequestStream() 

    bytesSize = fs.Read(UpBuffer, 0, UpBuffer.Length) 

    While (InlineAssignHelper(bytesSize, fs.Read(UpBuffer, 0, UpBuffer.Length))) > 0 
     'StatusUp[0] = ftpStream.Length; 
     StatusUp(0) = StatusUp(0) + UpBuffer.Length 
     StatusUp(1) = fileInf.Length 
     ' +startPointInt; 
     ftpStream.Write(UpBuffer, 0, bytesSize) 
    End While 
    fs.Close() 
    ftpStream.Close() 
    'response.Close(); 
End Sub 
0
Public Sub UploadData(FTPUri As String, FilePath As String, FileName As String, UserName As String, Password As String) 
StatusUp = New Int64(1) {} 

reqFTP = DirectCast(FtpWebRequest.Create(FTPUri & FileName), FtpWebRequest) 
reqFTP.Method = WebRequestMethods.Ftp.UploadFile 
reqFTP.UseBinary = True 
reqFTP.Credentials = New NetworkCredential(UserName, Password) 

Dim fileInf As New FileInfo(FilePath) 

Dim fs As FileStream = fileInf.OpenRead() 

' modifyied code 
Dim bytesSize As Integer = 0 
Dim UpBuffer As Byte() = New Byte(2047) {} 

ftpStream = reqFTP.GetRequestStream() 

bytesSize = fs.Read(UpBuffer, 0, UpBuffer.Length) 

While (InlineAssignHelper(bytesSize, fs.Read(UpBuffer, 0, UpBuffer.Length))) > 0 
    StatusUp(0) = StatusUp(0) + UpBuffer.Length 
    StatusUp(1) = fileInf.Length 
    ' +startPointInt; 
    ftpStream.Write(UpBuffer, 0, bytesSize) 
End While 

fs.Close() 
ftpStream.Close() 
End Sub 

voteupまたはそれがここ

+1

すべての回答で「投票するか受け入れてもらう」必要はありません。それが健全な助言ならば、それはコミュニティによって投票されるでしょう。 upvotesを絶えず求めていることで、おそらく人々はあなたの投稿に「投票しない」ようにしているでしょう。あなたのコードが質問者を助けるために何をしているのかを少し説明すれば、より良い回答が得られます。 – LarsTech

関連する問題