简体   繁体   English

将C#转换为VB.Net,未在下载的文件中添加字节

[英]Converted C# to VB.Net not adding byte to downloaded file

I've converted a code from C# to vb.net, however the converted code doesn't update the file (eg: add bytes to the saved file) while the original C# code works. 我已经将代码从C#转换为vb.net,但是在原始C#代码有效的情况下,转换后的代码不会更新文件(例如:将字节添加到保存的文件中)。 I am not knowledgeable in C# so I used an online converter to convert the code, tried fixing unconverted codes but to no avail. 我不懂C#,所以我使用了在线转换器来转换代码,尝试修复未转换的代码,但无济于事。

[original c# code] [原始的C#代码]

  if (serverVersion > localVersion)
            {
                Uri url = new Uri(sUrlToReadFileFrom);
                System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
                System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();
                response.Close();

                Int64 iSize = response.ContentLength;

                Int64 iRunningByteTotal = 0;

                using (System.Net.WebClient client = new System.Net.WebClient())
                {
                    using (System.IO.Stream streamRemote = client.OpenRead(new Uri(sUrlToReadFileFrom)))
                    {
                        using (Stream streamLocal = new FileStream(sFilePathToWriteFileTo, FileMode.Create, FileAccess.Write, FileShare.None))
                        {
                            int iByteSize = 0;
                            byte[] byteBuffer = new byte[iSize];
                            while ((iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
                            {
                                streamLocal.Write(byteBuffer, 0, iByteSize);
                                iRunningByteTotal += iByteSize;

                                double dIndex = (double)(iRunningByteTotal);
                                double dTotal = (double)byteBuffer.Length;
                                double dProgressPercentage = (dIndex / dTotal);
                                int iProgressPercentage = (int)(dProgressPercentage * 100);

                                backgroundWorker1.ReportProgress(iProgressPercentage);
                            }

                            streamLocal.Close();
                        }

                        streamRemote.Close();
                    }
                }

[converted c# to vb.net code] [将C#转换为vb.net代码]

  If (serverVersion > localVersion) Then
                Dim url As Uri = New Uri(sUrlToReadFileFrom)
                Dim request As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
                Dim response As HttpWebResponse = CType(request.GetResponse, HttpWebResponse)
                response.Close()

                Dim iSize As Int64 = response.ContentLength
                Dim iRunningByteTotal As Int64 = 0

                Dim client As System.Net.WebClient = New System.Net.WebClient
                Dim streamRemote As System.IO.Stream = client.OpenRead(New Uri(sUrlToReadFileFrom))
                Dim streamLocal As Stream = New FileStream(sFilePathToWriteFileTo, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.None)

                Dim iByteSize As Integer = 0
                Dim byteBuffer() As Byte = New Byte((iSize) - 1) {}

                While (streamRemote.Read(byteBuffer, 0, byteBuffer.Length) > 0)
                    streamLocal.Write(byteBuffer, 0, iByteSize)
                    iRunningByteTotal = iRunningByteTotal + iByteSize

                    Dim dIndex = CType((iRunningByteTotal), Double)
                    Dim dTotal = CType(byteBuffer.Length, Double)
                    Dim dProgressPercentage As Double = (dIndex / dTotal)
                    Dim iProgressPercentage As Integer = CType((dProgressPercentage * 100), Integer)


                    bgMain.ReportProgress(iProgressPercentage)

                    'status.Text = "Downloading updatess " & dIndex & " of " & dTotal

                End While

                streamLocal.Close()
                streamRemote.Close()

My issue is that, this code, writes the file from "sUrlToReadFileFrom" properly to "sFilePathToWriteFileTo" but the zip file is always 0 bytes and the Background worker loops without adding any byte to the file. 我的问题是,此代码将文件从“ sUrlToReadFileFrom”正确写入“ sFilePathToWriteFileTo”,但zip文件始终为0字节,并且后​​台工作程序循环而未在文件中添加任何字节。

You can't assign within an expression in VB. 您不能在VB中的表达式内赋值。 That is, you have to extract out the folowing assignment before the loop and within the loop at the end of the loop: 也就是说,您必须在循环之前和循环结束时在循环内提​​取以下分配:

iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)

The equivalent VB code is: 等效的VB代码为:

    If serverVersion > localVersion Then
        Dim url As New Uri(sUrlToReadFileFrom)
        Dim request As System.Net.HttpWebRequest = CType(System.Net.WebRequest.Create(url), System.Net.HttpWebRequest)
        Dim response As System.Net.HttpWebResponse = CType(request.GetResponse(), System.Net.HttpWebResponse)
        response.Close()

        Dim iSize As Int64 = response.ContentLength

        Dim iRunningByteTotal As Int64 = 0

        Using client As New System.Net.WebClient()
            Using streamRemote As System.IO.Stream = client.OpenRead(New Uri(sUrlToReadFileFrom))
                Using streamLocal As Stream = New FileStream(sFilePathToWriteFileTo, FileMode.Create, FileAccess.Write, FileShare.None)
                    Dim iByteSize As Integer = 0
                    Dim byteBuffer(iSize - 1) As Byte
                    iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)
                    Do While iByteSize > 0
                        streamLocal.Write(byteBuffer, 0, iByteSize)
                        iRunningByteTotal += iByteSize

                        Dim dIndex As Double = CDbl(iRunningByteTotal)
                        Dim dTotal As Double = CDbl(byteBuffer.Length)
                        Dim dProgressPercentage As Double = (dIndex / dTotal)
                        Dim iProgressPercentage As Integer = CInt(Math.Truncate(dProgressPercentage * 100))

                        backgroundWorker1.ReportProgress(iProgressPercentage)
                        iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)
                    Loop

                    streamLocal.Close()
                End Using

                streamRemote.Close()
            End Using
        End Using

The problem is this line: 问题是这一行:

while ((iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)) > 0)

It performs what's called inline assignment , which means that it assigns the result of streamRemote.Read() to iByteSize in the middle of a statement and then returns the result of that. 它执行所谓的内联分配 ,这意味着它在语句的中间将streamRemote.Read()的结果分配给iByteSize ,然后返回该结果。

VB.NET doesn't support this, which probably is why the converter you have used removed it. VB.NET不支持此功能,这可能就是您使用的转换器删除了它的原因。 Thus iByteSize will always be 0, and no bytes are written to the file. 因此, iByteSize将始终为0,并且没有字节写入文件。

The fix is to set the iByteSize variable separately before you enter the loop, and at the last line of the loop: 解决方法是在进入循环之前和循环的最后一行分别设置iByteSize变量:

iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)

While iByteSize > 0
    ...the rest of your code...

    'Put this last:
    iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)
End While

Also, the request and response variables doesn't appear to be used anywhere. 同样, requestresponse变量似乎没有在任何地方使用。 If this is the case you should remove them. 如果是这种情况,则应将其删除。

Try this: 尝试这个:

   If serverVersion > localVersion Then
        Dim url As New Uri(sUrlToReadFileFrom)
        Dim request As System.Net.HttpWebRequest = DirectCast(System.Net.WebRequest.Create(url), System.Net.HttpWebRequest)
        Dim response As System.Net.HttpWebResponse = DirectCast(request.GetResponse(), System.Net.HttpWebResponse)
        response.Close()

        Dim iSize As Int64 = response.ContentLength

        Dim iRunningByteTotal As Int64 = 0

        Using client As New System.Net.WebClient()
            Using streamRemote As System.IO.Stream = client.OpenRead(New Uri(sUrlToReadFileFrom))
                Using streamLocal As Stream = New FileStream(sFilePathToWriteFileTo, FileMode.Create, FileAccess.Write, FileShare.None)
                    Dim iByteSize As Integer = 0
                    Dim byteBuffer As Byte() = New Byte(iSize - 1) {}
                    While (InlineAssignHelper(iByteSize, streamRemote.Read(byteBuffer, 0, byteBuffer.Length))) > 0
                        streamLocal.Write(byteBuffer, 0, iByteSize)
                        iRunningByteTotal += iByteSize

                        Dim dIndex As Double = CDbl(iRunningByteTotal)
                        Dim dTotal As Double = CDbl(byteBuffer.Length)
                        Dim dProgressPercentage As Double = (dIndex / dTotal)
                        Dim iProgressPercentage As Integer = CInt(dProgressPercentage * 100)

                        backgroundWorker1.ReportProgress(iProgressPercentage)
                    End While

                    streamLocal.Close()
                End Using

                streamRemote.Close()
            End Using
        End Using
    End If

The InlineAssignHelper : InlineAssignHelper

Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, ByVal value As T) As T
  target = value
  Return value
End Function

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM