2013-07-25 6 views
2

Каков наилучший способ определить, является ли ftp-сервер онлайн или оффлайн в Visual Basic? Я пробовал много различных способов пинговать сервер FTP, но все, что я стараюсь, я получаю эту ошибку:Проверьте, находится ли FTP в сети/в автономном режиме

An exception occurred during a Ping request. 

Является ли это легко поправимо? Или есть лучший метод, чем то, что я использую?

+0

В запросе FTP нет смысла пинговать. Запрос FTP будет возвращать ошибку, если в любой момент сервер опустится или не ответит. – dbasnett

+0

Является ли ваше намерение исключительно видеть, можете ли вы получить ответ с FTP-сервера, или вы планируете сделать что-нибудь еще после этого, например, попытаться подключиться к нему? –

+0

@dbasnett, пожалуйста, дайте быстрый пример, не уверен, правильно ли я понимаю его. – rip2444

ответ

3

Используя WebRequest, попробуйте этот код я нашел

Привет, это должно работать нормально:

Imports System.Net 

    Dim request = _ 
    DirectCast(WebRequest.Create _ 
    ("ftp://ftp.example.com/folder_here/"), FtpWebRequest) 

    request.Credentials = _ 
    New NetworkCredential("user_here", "pass_here") 

    request.Method = WebRequestMethods.Ftp.ListDirectory 

    Try 
     Using response As FtpWebResponse = _ 
     DirectCast(request.GetResponse(), FtpWebResponse) 
      ' Folder exists here 
      MsgBox("exists!") 
     End Using 

    Catch ex As WebException 
     Dim response As FtpWebResponse = _ 
     DirectCast(ex.Response, FtpWebResponse) 
     'Does not exist 
     If response.StatusCode = _ 
     FtpStatusCode.ActionNotTakenFileUnavailable Then 
      MsgBox("Doesn't exist!") 
     End If 
    End Try 

..следующие Идея заключается в том, что мы используем класс FtpWebRequest и передать имя папки с слэш "/", если папка найдена, тогда ответ будет обработан в блоке Try-Catch, если папка не может быть найдена, мы обрабатываем контроль исключения с помощью statusCode (ActionNotTakenFileUnavailable), чтобы определить, не вызывает ли отсутствие папки исключение. Это должно работать нормально.

Sources First answer

--------------- Пожалуйста, попробуйте --------------------- -

Public Function CheckIfFtpFileExists(ByVal fileUri As String) As Boolean 
    Dim request As FtpWebRequest = WebRequest.Create(fileUri) 
    request.Credentials = New NetworkCredential("username", "password") 
    request.Method = WebRequestMethods.Ftp.GetFileSize 
     Try 
     Dim response As FtpWebResponse = request.GetResponse() 
     ' THE FILE EXISTS 
    Catch ex As WebException 
     Dim response As FtpWebResponse = ex.Response 
     If FtpStatusCode.ActionNotTakenFileUnavailable = response.StatusCode Then 
      ' THE FILE DOES NOT EXIST 
      Return False 
     End If 
    End Try 
    Return True 
End Function 

Get называеться так:

If CheckIfFtpFileExists("ftp://ftp.domain.com/filename.txt") Then 
    ' Do something 
End If 

Sources

+0

Очень приятно, оба они отлично работают! Спасибо! – rip2444

+0

Ваш прием :) Пожалуйста, не стесняйтесь голосовать и отмечать как правильную, если вы считаете, что она удовлетворяет ваш вопрос. –

+0

Эй, еще одна вещь: когда мой сервер отключен, и используется statusCode (ActionNotTakenFileUnavailable), программа перестает отвечать на запросы как 15 секунд, а затем снова начинает отвечать, но MsgBox не отображается. Чувствует, что он ловит исключение, но действительно не выполняет statusCode (ActionNotTakenFileUnavailable)? – rip2444

1

вы можете не только сделать это:

If My.Computer.Network.Ping("IP HERE") Then 
     ' Success 
    Else 
     'fail 
    End If 

Благодаря

Пол

+1

Ну, он работает с обычным ip, но он по-прежнему дает ту же ошибку, когда я набираю ftp-сервер: ftp://example.dyndns-server.com/ – rip2444

+0

, но пинг-код единственный? – rip2444

+1

IP - лучший способ, кроме того (проверка папки на FTP-сервере), если существует conection = good (если вы знаете, что эта папка всегда будет там в любом случае), на мой взгляд, хотя идея Стивена Лийкенса довольно милая, хотя, если он терпит неудачу, вы можете построить Retry или w/e, если у вас есть –

0

Обычно вы пишете свой код таким образом, что предполагает, что все идеально, а затем добавить обработку ошибок для случаев, когда соединение не работает.

Проверка того, что сервер находится в сети заранее, не гарантирует, что он будет оставаться таким образом в течение всего сеанса пользователя.

0
- (void)newBuddyOnline:(NSString *)buddyName { 

[onlineBuddies addObject:buddyName]; 
[self.TableView reloadData]; 

} 

- (void)buddyWentOffline:(NSString *)buddyName { 

[onlineBuddies removeObje` 
`ct:buddyName]; 
[self.TableView reloadData]; 
} 

Это может помочь.

+1

Хотя этот блок кода может ответить на вопрос, было бы лучше, если бы вы могли дать небольшое объяснение, почему оно это делает. – PlasmaHH

 Смежные вопросы

  • Нет связанных вопросов^_^