none
上傳的檔案錯誤 RRS feed

  • 問題

  •  



    ??? try  ?? System.NullReferenceException

    ?, ?? btnFTPUpLoad.Click ????????

    ???????,Thanks!!


        Private ftpTcpClient As TcpClient
        Private myStream As NetworkStream
        Private strLoginNameMessage As String
        Private strLoginPWDMessage As String


        '=======================????
        Private Sub btnFTPUpLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFTPUpLoad.Click

            Me.Cursor = Cursors.WaitCursor '====??????
            Dim strUPFilePath As String = txtFilePath.Text '================??????
            Dim strFtpAddress As String = txtDestFile.Text '================???FTP???
            Dim UPFile As New FileStream(txtFilePath.Text, FileMode.Open)
            Dim bytUPFile() As Byte
            Dim lngFileLength As Long
            Dim ftpStream As NetworkStream = GetResponseStream
            Dim returnMessage As String
            Dim UpLoadStream As NetworkStream

            lngFileLength = UPFile.Length
            FTPCommands(ftpStream, "PASV", returnMessage)
            UpLoadStream = GetConnectTcpClient(returnMessage)
            FTPCommands(ftpStream, "TYPE I", returnMessage)
            FTPCommands(ftpStream, "STOR " + strFtpAddress, returnMessage)

            ReDim bytUPFile(1024)
            Do
                lngFileLength = UPFile.Read(bytUPFile, 0, 1024)
                UpLoadStream.Write(bytUPFile, 0, lngFileLength)      ----------> System.NullReferenceException: ?????????????????
            Loop While lngFileLength > 0

            UpLoadStream.Close()
            UPFile.Close()
            Me.Cursor = Cursors.Default '====??????

        End Sub

        Private Function GetConnectTcpClient(ByVal respMessage As String) As NetworkStream

            Dim i As Integer
            Dim strIP As String
            Dim strIPs() As String
            Dim strAddress As String
            Dim intPort As Integer
            Try
                strIP = respMessage.Substring(respMessage.IndexOf("(")).Replace("(", "")
                strIPs = strIP.Split(",")
                strIP = ""
                For i = 0 To 3
                    strIP += strIPs(i) + "."
                Next
                strAddress = strIP.Substring(0, strIP.Length - 1)
                intPort = Integer.Parse(strIPs(4)) * 256 + _
                          Integer.Parse(strIPs(5).Substring(0, strIPs(5).IndexOf(")")))
                Dim dataClient As New TcpClient
                Dim cIPEP As New IPEndPoint(IPAddress.Parse(strAddress), intPort)
                dataClient.Connect(cIPEP)
                Return dataClient.GetStream

            Catch ex As System.ArgumentOutOfRangeException
            Catch ex As Exception
            End Try

        End Function


        Private Function FTPCommands(ByVal ftpStream As NetworkStream, ByVal strCommand As String, ByRef strMessage As String) As Integer

            Dim bteCommand() As Byte
            bteCommand = Encoding.Default.GetBytes(strCommand + vbCrLf)
            ftpStream.Write(bteCommand, 0, bteCommand.Length)
            Dim b(360000) As Byte
            ftpStream.Read(b, 0, 360000)
            strMessage = Encoding.Default.GetString(b)

        End Function


    ?????????????????
    ************** ?????? **************
    System.NullReferenceException: ?????????????????

    2006年8月9日 下午 03:01

解答

  • strIP = respMessage.Substring(respMessage.IndexOf("(")).Replace("(", "") 

    這一行的 respMessage.IndexOf() 傳回的值是 -1,表示找不到你要的字元 .
    你需要確定一下 respMessage 的內容是什麼,有可能是空值或是其他的資料 .

    2006年8月11日 上午 03:20
    版主
  • HI,

    您的程式的錯誤應該是respMessage字串的內容中找不到"(", 所以IndexOf方法傳回-1, 您可以在追蹤程式執行的時候, 追蹤到上述有問題的程式碼時, 將滑鼠停到respMessage變數上方, 看看是什麼內容, 應該不是您期望的內容, 如果內容不對, 查一下respMessage變數的內容來源是怎麼產生的

    tihs

     

    2006年8月11日 上午 03:43

所有回覆

  • HI,

    看樣子是GetConnectTcpClient執行失敗, 沒有傳回可用的NetworkStream, 您可以修改GetConnectTcpClient方法的

    Catch ex As Exception

    改成

    Catch ex As Exception

        MessageBox.Show(ex.Message)

    看看出現什麼錯誤訊息再做判斷

    tihs

    2006年8月10日 上午 05:44
  •  

    感謝 tihs 大大

       用 MessageBox.Show(ex.Message)  出現錯誤訊息如下

       StartIndex 不可以小於零

        參數名稱: startIndex

       按下 [確定] 後會再出現

       System.NullReferenceException: 並未將物件參考設定為物件的執行個體的錯誤

     

      請教要再如何處理? 謝謝!!

     

    2006年8月10日 上午 06:22
  • hi:

    您可以使用追蹤的技巧看程式執行到那一行才跳到Catch ex as Exception這一行程式碼的.

    tihs

    2006年8月10日 上午 09:17
  •  

      感謝 tihs 大大

            Dim i As Integer
            Dim strIP As String
            Dim strIPs() As String
            Dim strAddress As String
            Dim intPort As Integer
            strIP = respMessage.Substring(respMessage.IndexOf("(")).Replace("(", "") 

             '----這一行 出現  其他資訊: StartIndex 不可以小於零。" System.ArgumentOutOfRangeException "的錯誤訊息

            strIPs = strIP.Split(",")
            strIP = ""
            For i = 0 To 3
                strIP += strIPs(i) + "."
            Next
            strAddress = strIP.Substring(0, strIP.Length - 1)
            intPort = Integer.Parse(strIPs(4)) * 256 + _
                      Integer.Parse(strIPs(5).Substring(0, strIPs(5).IndexOf(")")))
            Dim dataClient As New TcpClient
            Dim cIPEP As New IPEndPoint(IPAddress.Parse(strAddress), intPort)
            dataClient.Connect(cIPEP)
            Return dataClient.GetStream

       請教要再如何處理? 謝謝!!

     

    2006年8月10日 下午 03:26
  • strIP = respMessage.Substring(respMessage.IndexOf("(")).Replace("(", "") 

    這一行的 respMessage.IndexOf() 傳回的值是 -1,表示找不到你要的字元 .
    你需要確定一下 respMessage 的內容是什麼,有可能是空值或是其他的資料 .

    2006年8月11日 上午 03:20
    版主
  •  

    感謝 小朱  大大

    就是 Null (空值) 那要再如何處理?

    Thanks

    2006年8月11日 上午 03:30
  • HI,

    您的程式的錯誤應該是respMessage字串的內容中找不到"(", 所以IndexOf方法傳回-1, 您可以在追蹤程式執行的時候, 追蹤到上述有問題的程式碼時, 將滑鼠停到respMessage變數上方, 看看是什麼內容, 應該不是您期望的內容, 如果內容不對, 查一下respMessage變數的內容來源是怎麼產生的

    tihs

     

    2006年8月11日 上午 03:43
  •  感謝 tihs 大大

    提供參考方向,

    我會測試看看, 如有不懂之處 ,

    可能再麻煩 tihs, 小朱  大大 們 指導喔!! Thanks ^_^

    2006年8月12日 上午 04:37