solicitado - ¿Cómo se cambian los directorios usando FtpWebRequest(.NET)?
el uri solicitado no es válido para este comando ftp (3)
En lugar de utilizar el método ListDirectory de FTPWebRequest, puede usar el método ListDirectoryDetails de FtpWebRequest.
De eso puede usar expresiones regulares para obtener el valor que desea. Eso es todo, funciona bien para mí en mi caso
¿Puede alguien decirme cómo cambiar directorios usando FtpWebRequest? Parece que debería ser algo fácil de hacer, pero no lo estoy viendo.
EDITAR
Solo quiero agregar ... No tengo mi corazón puesto en FtpWebRequest. Si hay una manera mejor (más fácil) de hacer FTP en .NET, por favor avíseme.
Aparentemente no hay forma de hacerlo usando una conexión en vivo, necesitas cambiar el uri para engañar a ftpwebrequest y usar una solicitud diferente (gracias Jon).
Así que estoy buscando un cliente de terceros ...
Algunas de las soluciones de código abierto que probé no funcionaron demasiado bien (seguían fallando), pero encontré una solución de código abierto que pasó algunas de mis pruebas preliminares ( .NET FTP Client ).
Hay una publicación de blog de Mariya Atanasova que muestra cómo puedes fingir, básicamente tienes que poner el directorio en la URL.
Sospecho que puede que estés mejor con una biblioteca FTP dedicada, una que no intente forzar todo en la forma de hacer las cosas de WebRequest. No he utilizado personalmente ninguna biblioteca de terceros para esto, pero una búsqueda de "FTP library .NET" encuentra muchos candidatos.
Editar: jcolebrand (en el caso de la posibilidad de blog linkrot 2006)
Muchos clientes nos preguntan cómo pueden usar el comando CWD con nuestra FtpWebRequest.
La respuesta es: no puede usar el comando directamente, pero puede modificar el parámetro uri para lograr el mismo resultado.
Digamos que estás usando el siguiente formato:
String uri = "ftp://myFtpUserName:myFtpUserPassword@myFtpUrl";
FtpWebRequest Request = (FtpWebRequest)WebRequest.Create(uri);
Request.Method = "LIST";
El ejemplo anterior lo llevará al directorio de su usuario y listará todos los contenidos allí. Ahora digamos que desea ir 2 directorios hacia atrás y enumerar los contenidos allí (siempre que su usuario tenga permisos para hacerlo). Cierra la FtpWebRequest anterior y emite una nueva con este uri
uri = "ftp://myFtpUserName:myFtpUserPassword@myFtpUrl/%2E%2E/%2E%2E";
Esto es equivalente a iniciar sesión con las credenciales de su usuario y luego usar
cd ../../
Nota: si intentas usar el
”..”
directamente sin escapar de ellos, la clase uri los despojará, por lo que"ftp://myFtpUserName:myFtpUserPassword@myFtpUrl/../.."
es equivalente a"ftp://myFtpUserName:myFtpUserPassword@myFtpUrl/"
Ahora digamos que desea ir al directorio de otro usuario que está un nivel por encima de la raíz. Si no especifica un nombre de usuario y contraseña, es equivalente a iniciar sesión como usuario anónimo. Luego, emite un nuevo
FtpWebRequest
con el siguiente uri
"ftp://myFtpUrl/%2F/anotherUserDir"
Esto es equivalente a iniciar sesión como anónimo y luego hacer
Cd /
cd anotherUserDirectory
Tienes que cerrar la conexión actual:
request.Close();
Y abre uno nuevo con otro 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);