2010-08-23 2 views
0

Использование библиотеки для подключения к удаленному серверу и копирования файла. У меня есть процесс, который работает достаточно хорошо, но у меня есть некоторые более мелкие вещи, которые я, похоже, не могу решить, поскольку документация для библиотеки довольно тонкая.SharpSSH Progress and Rename

У меня есть две процедуры работы. Один из них использует класс Tamir.SharpSsh, а другой - класс Tamir.SharpSsh.jsch.

  1. Использование класса Tamir.SharpSsh Я могу скопировать файл с локального сервера на удаленный сервер и нажмите на событие pogress. То, что я не могу сделать, это определить, существует ли конкретный файл на удаленном сервере /Report/data.txt на сервере. Мне нужно предпринять разные действия, если они существуют или нет. Также как бы переименовать файл на удаленном сервере. Ive попытался использовать SshExec с командой «rename», «rn» и «mv», и она, похоже, не работает.

  2. Использование Tamir.SharpSsh.jsch Я могу скопировать файл с локального сервера на удаленный сервер. Я также могу переименовать файл на удаленном сервере. То, что я не могу сделать с этим классом, - это задействовать событие прогресса, чтобы отслеживать ход копирования. Также я не могу найти хороший способ проверить, существует ли конкретный файл на сервере. То, что я придумал груба и единственный способ, которым я мог придумать, чтобы проверить, и что является использование

    Dim c As ChannelSftp 
        Dim vct As Tamir.SharpSsh.java.util.Vector = c.ls(sRemoteFile) 
        Dim cnt As Integer = vct.Count 
    

Когда один или несколько файлов существует ли я получить счет никаких проблем. Когда нет файла, генерируется исключение.

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

ТИА AGP

ответ

2

Вы можете вызвать метод Tamir.SharpSsh.Sftp.GetFile используя путь файла, который вы хотите проверить, существует (например, в C#, извините):

private bool FileExists(string filePath) 
{ 
    try 
    { 
     SftpConnection connection = new SftpConnection(_host, _username, _password); 
     connection.Connect(_port); 
     connection.Get(filePath, _toDir); 
    } 
    catch(JSchException) 
    { 
     return false; 
    } 
    return true; 
} 

Я также заметил несколько других вопросов через мое использование этой библиотеки - как отсутствие метода GetFileInfo или рекурсивного метода Gets and Puts. Но в целом он выполняет свою работу.

Простым фактом является то, что Tamir.SharpSsh не может переименовывать файл удаленно - он просто не реализует эту функциональность. Вы можете приобрести лучшую библиотеку, которая имеет гораздо больше функций, таких как:

  • Келлерман Software .NET SFTP Библиотека
  • wodSFTP.NET
  • Rebex SFTP для .NET
  • edtFTPnet/PRO

или вы можете расширить SharpSsh, так как это с открытым исходным кодом.

+0

Да, я пробовал что-то подобное с Tamir.SharpSsh.jsch, но мне кажется странным, что вам нужно сделать исключение для dwtect отсутствия файла. вот что я сделал некоторое время назад – sinDizzy

+1

Да, это странно. И, кроме того, его плохая практика - использовать исключения для логики, а не для обработки ошибок. Единственное другое предложение, которое я могу сделать, - попробовать продукт Rebex (http://www.rebex.net/sftp.net/), у которого есть метод FileExists, чтобы проверить, существует ли файл на сервере. API-интерфейсы в основном такие же, поэтому легко переноситься, но это не бесплатно. – Nobody

0

Ваши вопросы из-за ограничений протокола SFTP. - чтобы проверить существование файла, попробуйте вернуть атрибуты этого файла; - большинство серверов пока не поддерживают переименование файлов.

+0

Я не уверен, что понял. Я могу переименовать файл, используя Tamir.SharpSsh.jsch, без проблем. Я просто хочу сделать то же самое с Tamir.SharpSsh. Я также могу переименовать, используя графический интерфейс Bitvise Tunnelier. Я сделал это сто раз, теперь я просто хочу его автоматизировать. Я проверю атрибуты файлов, но могу поклясться, что я уже пробовал это. – sinDizzy

+0

Nickolay, SFTP поддерживает переименование файлов. Он также поддерживает намного больше. Это _implementation_ (SharpSsh), который их не поддерживает. Я имею в виду тип пакета SSH_FXP_RENAME, указанный на стр. 7 спецификации протокола: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13 – Nobody

+0

Да, протокол поддерживает эту функцию. Но большинство реализаций протокола SFTP нет. –

0

Да, я пробовал что-то подобное с Tamir.SharpSsh.jsch, но мне кажется странным, что вам нужно поймать исключение, чтобы обнаружить небытие файла.вот что я сделал после того, как я опубликовал:

Private Function FileExistsOnServer(ByVal c As ChannelSftp, ByVal sRemoteFile As String) As Boolean 
    Try 
     'get a file listing of the file 
     Dim vct As Tamir.SharpSsh.java.util.Vector = c.ls(sRemoteFile) 
     Dim cnt As Integer = vct.Count 

     'if the count is greater than zero then the file already exists. if its 0 then the file does 
     'not exist on the server 
     If cnt > 0 Then 
      Return True 
     Else 
      Return False 
     End If 
    Catch ex As Exception 
     'if we get an exception then assume the file does not exist on the server 
     Return False 
    End Try 
End Function