Использование функции загрузки C # в VB.Net - PullRequest
0 голосов
/ 01 января 2012

Это очень специфично.Мне нужна помощь с использованием функции C # в моей программе VB.Net. Эта функция находится в DLL, код которой приведен ниже:

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 # неправильным (я не написал его и тот, кто ушел из компании), но где-то кажется, что он не закрывает файл или что-то в этом роде.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 01 января 2012
bytesSize = fs.Read(UpBuffer, 0, UpBuffer.Length);

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

Два красных флага здесь. Первый - причина вашей проблемы, дополнительный вызов fs.Read () перед входом в цикл while. Это 2048 байт, которые вы не используете и не загружаете. Просто удали эту строку. Вы избегаете подобных ошибок, используя for (;;) и break.

Назначение StatusUp [0] выглядит плохо, вы должны добавить bytesSize, а не UpBuffer.Length. В остальном не очевидно, какие у него побочные эффекты.

0 голосов
/ 01 января 2012
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

голосуйте или принимайте, если это работает

0 голосов
/ 01 января 2012

Это 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...