2010-08-23 4 views
0

Utilisation de la bibliothèque pour se connecter à un serveur distant et copier un fichier. J'ai le processus fonctionne assez bien, mais j'ai quelques petites choses que je ne peux pas résoudre comme documentation pour la bibliothèque est assez mince.SharpSSH Progression et renommage

J'ai deux routines qui fonctionnent. Un utilisant la classe Tamir.SharpSsh et l'autre utilisant la classe Tamir.SharpSsh.jsch.

  1. Utilisation de la classe Tamir.SharpSsh Je suis en mesure de copier le fichier à partir du serveur local vers le serveur distant et tapez dans l'événement pogress. Ce que je ne peux pas faire est de déterminer si un fichier particulier sur le serveur distant indique /Report/data.txt existe sur le serveur. Je dois prendre différentes actions si elles existent ou si elles n'existent pas. Aussi, comment je renommer un fichier sur le serveur distant. J'ai essayé d'utiliser SshExec avec une commande 'rename', 'rn' et 'mv' et cela ne semble pas fonctionner. En utilisant le Tamir.SharpSsh.jsch, je peux copier le fichier du serveur local sur le serveur distant. Je peux également renommer le fichier sur le serveur distant. Ce que je ne peux pas faire avec cette classe est de puiser dans l'événement de progression pour suivre la progression de la copie. Aussi, je ne peux pas sembler trouver un bon moyen de tester pour voir si un fichier particulier existe sur le serveur. Ce que je suis venu avec est brut et la seule façon que je pouvais venir avec pour tester et qui est d'utiliser

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

Lorsqu'un ou plusieurs fichier existe, je reçois un nombre sans problème. Lorsqu'il n'y a pas de fichier, une exception est levée.

Quoi qu'il en soit, j'ai les routines de travail juste quelques petites choses que j'ai besoin d'aide.

tia AGP

Répondre

2

Vous pouvez appeler la méthode Tamir.SharpSsh.Sftp.GetFile en utilisant le chemin du fichier que vous voulez vérifier existe (par exemple en C#, désolé):

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; 
} 

J'ai aussi remarqué quelques autres questions par mon utilisation de cette bibliothèque - Comme un manque d'une méthode GetFileInfo ou Gets and Puts récursif. Mais dans l'ensemble, le travail est fait. Le fait est que Tamir.SharpSsh ne peut pas renommer un fichier à distance - il n'implémente simplement pas cette fonctionnalité. Vous pouvez acheter une meilleure bibliothèque qui a beaucoup plus de fonctionnalités, telles que:

  • Kellerman Software .NET SFTP Library
  • wodSFTP.NET
  • Rebex SFTP pour
  • .NET
  • edtFTPnet/PRO

ou vous pourriez étendre SharpSsh, car il est open source.

+0

ouais j'ai essayé quelque chose de similaire avec Tamir.SharpSsh.jsch mais il me semble étrange que vous ayez à cathc l'exception à la non-existence d'un fichier dwtect. voici ce que j'ai fait il y a un moment – sinDizzy

+1

Oui, c'est bizarre. De plus, il est mauvais d'utiliser des exceptions pour la logique plutôt que pour la gestion des erreurs. La seule autre suggestion que je peux faire est d'essayer le produit Rebex (http://www.rebex.net/sftp.net/) qui a une méthode 'FileExists' pour vérifier si un fichier existe sur le serveur. Les API sont largement les mêmes, il serait donc facile de migrer vers, mais ce n'est pas gratuit. – Nobody

0

Vos questions sont en raison des limitations du protocole SFTP. - pour vérifier l'existence d'un fichier, essayez de renvoyer les attributs de ce fichier; - la plupart des serveurs ne prennent pas en charge le changement de nom de fichier pour l'instant.

+0

Je ne suis pas certain de comprendre. Je peux renommer le fichier en utilisant Tamir.SharpSsh.jsch sans problème. Je veux juste faire la même chose avec Tamir.SharpSsh. Je peux aussi renommer en utilisant l'interface graphique de Bitvise Tunnelier. Je l'ai fait une centaine de fois, maintenant je veux juste l'automatiser. Je vais vérifier les attributs du fichier, mais j'aurais juré que j'ai déjà essayé. – sinDizzy

+0

Nickolay, SFTP prend en charge le changement de nom des fichiers. Il supporte aussi beaucoup plus. C'est la _implementation_ (SharpSsh) qui ne les supporte pas. Je me réfère au type de paquet SSH_FXP_RENAME listé à la page 7 de la spécification de protocole: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13 – Nobody

+0

Oui, le protocole supporte cette fonctionnalité. Mais la plupart des implémentations de protocole SFTP ne le sont pas. –

0

ouais j'ai essayé quelque chose de similaire avec Tamir.SharpSsh.jsch mais il me semble étrange que vous deviez attraper l'exception pour détecter la non-existence d'un fichier.voici ce que j'ai fait après que j'ai posté:

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 
Questions connexes