Question

Quelqu'un peut-il me dire comment changer de répertoire en utilisant FtpWebRequest? Cela semble être une chose facile à faire, mais je ne le vois pas.

MODIFIER

Je veux juste ajouter ... Je n'ai pas le coeur tourné vers FtpWebRequest. S'il existe un moyen plus simple (plus facile) d'utiliser FTP dans .NET, faites-le-moi savoir.

Apparemment, il n'y a aucun moyen de le faire en utilisant une connexion en direct, vous devez changer l'uri pour tromper ftpwebrequest en utilisant une requête différente (merci Jon).

Je recherche donc un client tiers ...

Certaines des solutions open source que j'ai essayées ne fonctionnaient pas très bien (j'ai continué à planter), mais j'ai trouvé une solution open source ayant réussi certains de mes tests préliminaires ( client FTP .NET ).

Était-ce utile?

La solution

Il y a un article de blog de Mariya Atanasova qui montre comment vous pouvez simuler - en gros, vous devez placer le répertoire sur l'URL.

Je suppose que vous auriez peut-être intérêt à utiliser une bibliothèque FTP dédiée, une bibliothèque qui n'essaie pas de tout imposer à la manière dont WebRequest agit. Je n'ai personnellement utilisé aucune bibliothèque tierce à cette fin, mais j'ai effectué une recherche sur " Bibliothèque FTP .NET " trouve beaucoup de candidats.

Modifier: jcolebrand (dans le cas d'une possibilité de blog linkrot en 2006)

  

De nombreux clients nous demandent comment ils peuvent utiliser la commande CWD avec notre requête FtpWebRequest.

     

La réponse est: vous ne pouvez pas utiliser la commande directement, mais vous pouvez modifier le paramètre uri pour obtenir le même résultat.

     

Disons que vous utilisez le format suivant:

String uri = "ftp://myFtpUserName:myFtpUserPassword@myFtpUrl";
FtpWebRequest Request = (FtpWebRequest)WebRequest.Create(uri);
Request.Method = "LIST";
  

L'exemple ci-dessus vous mènera au répertoire de votre utilisateur et y listera tout le contenu. Maintenant, disons que vous voulez aller 2 répertoires en arrière et lister le contenu là-bas (à condition que votre utilisateur ait l'autorisation de le faire). Vous fermez la requête FtpWebRequest précédente et en publiez une nouvelle avec cet uri

uri = "ftp://myFtpUserName:myFtpUserPassword@myFtpUrl/%2E%2E/%2E%2E";
  

Cela équivaut à se connecter avec les informations d'identification de votre utilisateur, puis à l'aide de cd ../../

     

Remarque: si vous essayez d’utiliser le & # 8221; .. & # 8221; directement sans leur échapper, la classe uri les supprimera. Ainsi, & ft; ftp: // myFtpUserName: myFtpUserPassword @ myFtpUrl /../..& "; est équivalent à "; ftp: // myFtpUserName: myFtpUserPassword @ myFtpUrl / "

.      

Supposons maintenant que vous souhaitiez accéder au répertoire d'un autre utilisateur situé à un niveau supérieur à la racine. Si vous ne spécifiez pas de nom d'utilisateur ni de mot de passe, cela revient à vous connecter en tant qu'utilisateur anonyme. Ensuite, vous émettez un nouveau FtpWebRequest avec l'URI suivant

"ftp://myFtpUrl/%2F/anotherUserDir"
  

Cela équivaut à se connecter en tant qu'anonyme, puis à faire

.
Cd /
cd anotherUserDirectory

Autres conseils

Vous devez fermer la connexion en cours:

request.Close();

Et ouvrez un nouveau avec un autre uri:

uri = "ftp://example.com/%2F/directory" //Go to a forward directory (cd directory)
uri = "ftp://example.com/%2E%2E" //Go to the previously directory (cd ../)

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);

Au lieu d'utiliser la méthode ListDirectory de FTPWebRequest, vous pouvez utiliser la méthode ListDirectoryDetails de FtpWebRequest.

À partir de là, vous pouvez utiliser une expression régulière pour obtenir la valeur souhaitée. Ça y est, ça marche très bien pour moi dans mon cas

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top