2016-03-26 9 views
2

Ich habe eine Funktion zu überprüfen, ob eine Remote-Datei existiert, nachdem die URL übergeben wurde. Unter der Annahme, dass es nicht existiert, würde die Funktion 0 zurückgeben, um in einem anderen Sub verwendet zu werden. Hier ist, was ich habe:VB.net - sehen, ob Remote-Datei existiert

Public Function RemoteFileExists(ByVal fileurl As String) As Integer 
    Dim request As FtpWebRequest = DirectCast(WebRequest.Create(fileurl), FtpWebRequest) 
    request.Method = WebRequestMethods.Ftp.GetFileSize 
    Dim response As FtpWebResponse = DirectCast(request.GetResponse(), FtpWebResponse) 
    If response.StatusCode = FtpStatusCode.ActionNotTakenFileUnavailable Then 
     RemoteFileExists = 0 
     Exit Function 
    End If 
    Dim fileSize As Long = response.ContentLength 
    MsgBox(fileSize) 
    If fileSize > 0 Then 
     RemoteFileExists = 1 
    Else 
     RemoteFileExists = 0 
    End If 
End Function 

Wenn ich die app laufen und liefern absichtlich eine URL, die nicht Visual Studio vorhanden ist, gibt mir System.Net.WebException wurde nicht behandelt. Nachricht = Der Remote-Server hat einen Fehler zurückgegeben: (550) Datei nicht verfügbar (z. B. Datei nicht gefunden, kein Zugriff).

Ich ging davon aus, dass das "if response.StatusCode ..." damit umgehen würde, anstatt das Programm herunterzufahren.

Jede Hilfe wird geschätzt.

DWM

+0

Wie wäre es, alles in einen 'Try' /' Catch' Block zu bringen und false zurückzugeben, wenn eine Ausnahme ausgelöst wird? –

+0

Übrigens, ** 1) ** Warum verwenden Sie eine "Ganzzahl" als Rückgabetyp anstelle von "Boolesch"? ** 2) ** Rufen Sie 'Return 0' oder' Return 1' anstelle von 'RemoteFileExists = ...' auf und 'Exit Function' (Aufruf von' Return' beendet ebenfalls die Funktion). –

+0

Ich benutzte eine ganze Zahl, weil ich das herausfinden konnte. Ich habe versucht, es zu versuchen, konnte es aber nicht richtig machen. Ich bin ziemlich neu in VB. Wenn Sie mir ein Beispiel geben möchten, wäre ich sehr dankbar. –

Antwort

1

allererst Sie Integer-Boolean wechseln sollte, da man nur entweder 1 oder 0 sowieso zurück. A Boolean kann entweder True oder False sein.

Zweitens sollten Sie alles in einen Try/Catch Block wickeln, um jeden möglichen Fehler zu behandeln. Wrapping-Code in Try/Catch kann die meisten Fehler abfangen (außer den extremsten) und um Code herumzulegen, der einen Fehler auslösen könnte, erspart Ihnen den Absturz Ihrer Anwendung für die einfacheren Fehler.

Und schließlich sollten Sie Return <value> anstelle von RemoteFileExists = <value> verwenden, da Return beide den gewünschten Wert zurückgeben UND die Funktion verlassen.

Beispiel Durchführung:

Public Function RemoteFileExists(ByVal fileurl As String) As Boolean 
    Try 
     Dim request As FtpWebRequest = DirectCast(WebRequest.Create(fileurl), FtpWebRequest) 
     request.Method = WebRequestMethods.Ftp.GetFileSize 
     Dim response As FtpWebResponse = DirectCast(request.GetResponse(), FtpWebResponse) 
     If response.StatusCode = FtpStatusCode.ActionNotTakenFileUnavailable Then 
      Return False 'Return instead of Exit Function 
     End If 
     Dim fileSize As Long = response.ContentLength 
     MsgBox(fileSize) 
     If fileSize > 0 Then 
      Return True 
     Else 
      Return False 
     End If 
    Catch ex As Exception 'Catch all errors 
     'Log the error if you'd like, you can find the error message and location in "ex.Message" and "ex.StackTrace". 
     MessageBox.Show("An error occurred:" & Environment.NewLine & ex.Message & Environment.NewLine & ex.StackTrace, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
     Return False 'Return False since the checking failed. 
    End Try 
End Function 

Im Catch Block ex.Message ist die Fehlermeldung und ex.StackTrace ist, wo in dem Code der Fehler aufgetreten ist.

+0

Danke. Ich lerne VB, indem ich Beispiele von Code betrachte, und das ist hilfreich. Es ist auch hilfreich, dass Sie meine Frage tatsächlich beantwortet haben und dies ohne die Herablassung, die ich oft in Foren finde. Gott segne. DWM –

+0

@DavidMize: Froh, es hat funktioniert und Sie zufriedengestellt! Ich würde mich freuen, wenn Sie meinen Beitrag als angenommene Antwort markieren würden, indem Sie auf das grüne Häkchen auf der linken Seite drücken. Dies belohnt den Beantworter (mich) mit 15 Rufpunkten und es gibt Ihnen (als Fragesteller) 2 Wiederholungen. Punkte. –