ver una saber net existe example crear carpeta archivo c# ftp ftpwebrequest

c# - una - Cómo comprobar si existe un directorio FTP



saber si existe una carpeta c# (10)

Básicamente atrapó el error que recibo al crear el directorio como tal.

private bool CreateFTPDirectory(string directory) { try { //create the directory FtpWebRequest requestDir = (FtpWebRequest)FtpWebRequest.Create(new Uri(directory)); requestDir.Method = WebRequestMethods.Ftp.MakeDirectory; requestDir.Credentials = new NetworkCredential("username", "password"); requestDir.UsePassive = true; requestDir.UseBinary = true; requestDir.KeepAlive = false; FtpWebResponse response = (FtpWebResponse)requestDir.GetResponse(); Stream ftpStream = response.GetResponseStream(); ftpStream.Close(); response.Close(); return true; } catch (WebException ex) { FtpWebResponse response = (FtpWebResponse)ex.Response; if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) { response.Close(); return true; } else { response.Close(); return false; } } }

Buscando la mejor manera de verificar un directorio dado a través de FTP.

Actualmente tengo el siguiente código:

private bool FtpDirectoryExists(string directory, string username, string password) { try { var request = (FtpWebRequest)WebRequest.Create(directory); request.Credentials = new NetworkCredential(username, password); request.Method = WebRequestMethods.Ftp.GetDateTimestamp; FtpWebResponse response = (FtpWebResponse)request.GetResponse(); } catch (WebException ex) { FtpWebResponse response = (FtpWebResponse)ex.Response; if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) return false; else return true; } return true; }

Esto devuelve falso si el directorio está allí o no. Alguien me puede apuntar en la dirección correcta.


Intenté de todas maneras obtener un cheque sólido, pero ni los métodos WebRequestMethods.Ftp.PrintWorkingDirectory ni WebRequestMethods.Ftp.ListDirectory funcionarán correctamente. Se produjo un error al buscar ftp://<website>/Logs que no existen en el servidor, pero dicen que sí.

Así que el método que se me ocurrió fue intentar subir a la carpeta. Sin embargo, un ''gotcha'' es el formato de ruta que puede leer en este hilo Subida a Linux

Aquí hay un fragmento de código

private bool DirectoryExists(string d) { bool exists = true; try { string file = "directoryexists.test"; string path = url + homepath + d + "/" + file; //eg ftp://website//home/directory1/directoryexists.test //Note the double space before the home is not a mistake //Try to save to the directory req = (FtpWebRequest)WebRequest.Create(path); req.ConnectionGroupName = "conngroup1"; req.Method = WebRequestMethods.Ftp.UploadFile; if (nc != null) req.Credentials = nc; if (cbSSL.Checked) req.EnableSsl = true; req.Timeout = 10000; byte[] fileContents = System.Text.Encoding.Unicode.GetBytes("SAFE TO DELETE"); req.ContentLength = fileContents.Length; Stream s = req.GetRequestStream(); s.Write(fileContents, 0, fileContents.Length); s.Close(); //Delete file if successful req = (FtpWebRequest)WebRequest.Create(path); req.ConnectionGroupName = "conngroup1"; req.Method = WebRequestMethods.Ftp.DeleteFile; if (nc != null) req.Credentials = nc; if (cbSSL.Checked) req.EnableSsl = true; req.Timeout = 10000; res = (FtpWebResponse)req.GetResponse(); res.Close(); } catch (WebException ex) { exists = false; } return exists; }


La única forma en que funcionó para mí fue una lógica inversa al intentar crear el directorio / ruta (que generará una excepción si ya existe) y, si es así, eliminarlo de nuevo más tarde. De lo contrario, use la excepción para establecer una marca que indique que el directorio / ruta existe. Soy bastante nuevo en VB.NET y estoy seguro de que hay una manera mejor de codificar esto, pero de todos modos aquí está mi código:

Public Function DirectoryExists(directory As String) As Boolean '' Reversed Logic to check if a Directory exists on FTP-Server by creating the Directory/Path '' which will throw an exception if the Directory already exists. Otherwise create and delete the Directory '' Adjust Paths Dim path As String If directory.Contains("/") Then path = AdjustDir(directory) ''ensure that path starts with a slash Else path = directory End If '' Set URI (formatted as ftp://host.xxx/path) Dim URI As String = Me.Hostname & path Dim response As FtpWebResponse Dim DirExists As Boolean = False Try Dim request As FtpWebRequest = DirectCast(WebRequest.Create(URI), FtpWebRequest) request.Credentials = Me.GetCredentials ''Create Directory - if it exists WebException will be thrown request.Method = WebRequestMethods.Ftp.MakeDirectory ''Delete Directory again - if above request did not throw an exception response = DirectCast(request.GetResponse(), FtpWebResponse) request = DirectCast(WebRequest.Create(URI), FtpWebRequest) request.Credentials = Me.GetCredentials request.Method = WebRequestMethods.Ftp.RemoveDirectory response = DirectCast(request.GetResponse(), FtpWebResponse) DirExists = False Catch ex As WebException DirExists = True End Try Return DirExists End Function

WebRequestMethods.Ftp.MakeDirectory y WebRequestMethods.Ftp.RemoveDirectory son los métodos que he utilizado para esto. Todas las otras soluciones no funcionaron para mí.

Espero eso ayude


Me gustaría probar algo en esta línea:

  • Envíe el comando FTP MLST <directory> (definido en RFC3659) y analice su salida. Debe devolver una línea válida con detalles de directorio para directorios existentes.

  • Si el comando MLST no está disponible, intente cambiar el directorio de trabajo al directorio probado usando un comando CWD. No olvide determinar la ruta actual (comando PWD) antes de cambiar a un directorio probado para poder regresar.

  • En algunos servidores, la combinación de comandos MDTM y SIZE se puede usar para propósitos similares, pero el comportamiento es bastante complejo y está fuera del alcance de esta publicación.

Esto es básicamente lo que hace el método DirectoryExists en la versión actual de nuestro componente Rebex FTP . El siguiente código muestra cómo usarlo:

string path = "/path/to/directory"; Rebex.Net.Ftp ftp = new Rebex.Net.Ftp(); ftp.Connect("hostname"); ftp.Login("username","password"); Console.WriteLine( "Directory ''{0}'' exists: {1}", path, ftp.DirectoryExists(path) ); ftp.Disconnect();


Navegue al directorio padre, ejecute el comando "ls" y analice el resultado.


No pude hacer funcionar esta sugerencia de @BillyLogans ...

Encontré que el problema era que el directorio FTP predeterminado era / home / usr / fred

Cuando utilicé

String directory = "ftp://some.domain.com/mydirectory" FtpWebRequest requestDir = (FtpWebRequest)FtpWebRequest.Create(new Uri(directory));

Encontré esto se convierte en

"ftp:/some.domain.com/home/usr/fred/mydirectory"

Para detener esto cambia el directorio uri a:

String directory = "ftp://some.domain.com//mydirectory"

Entonces esto comienza a funcionar.


Para lo que vale, hará que su vida de FTP sea un poco más fácil si utiliza el componente FTP de EnterpriseDT . Es gratis y le ahorrará dolores de cabeza porque trata con los comandos y las respuestas. Solo trabajas con un objeto bonito y simple.


Supongo que ya está algo familiarizado con FtpWebRequest, ya que esta es la forma habitual de acceder a FTP en .NET.

Puede intentar enumerar el directorio y verificar si hay un StatusCode de error.

try { FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.microsoft.com/12345"); request.Method = WebRequestMethods.Ftp.ListDirectory; using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) { // Okay. } } catch (WebException ex) { if (ex.Response != null) { FtpWebResponse response = (FtpWebResponse)ex.Response; if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) { // Directory not found. } } }


Usuario este código puede ser su respuesta ..

public bool FtpDirectoryExists(string directoryPath, string ftpUser, string ftpPassword) { bool IsExists = true; try { FtpWebRequest request = (FtpWebRequest)WebRequest.Create(directoryPath); request.Credentials = new NetworkCredential(ftpUser, ftpPassword); request.Method = WebRequestMethods.Ftp.PrintWorkingDirectory; FtpWebResponse response = (FtpWebResponse)request.GetResponse(); } catch (WebException ex) { IsExists = false; } return IsExists; }

He llamado a este método como:

bool result = FtpActions.Default.FtpDirectoryExists( @"ftp://mydomain.com/abcdir", txtUsername.Text, txtPassword.Text);

¿Por qué usar otra biblioteca? Crea tus propias lógicas.


Yo también estaba atrapado con el problema similar. Estaba usando

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftpserver.com/rootdir/test_if_exist_directory"); request.Method = WebRequestMethods.Ftp.ListDirectory; FtpWebResponse response = (FtpWebResponse)request.GetResponse();

y esperó la excepción en caso de que el directorio no exista. Este método no arrojó excepción.

Después de algunos intentos y intentos, cambié el directorio de: " ftp://ftpserver.com/rootdir/test_if_exist_directory " a: " ftp://ftpserver.com/rootdir/test_if_exist_directory/ ". Ahora esta pieza está trabajando para mí.

Creo que deberíamos añadir barra diagonal inversa (/) en el uri de la carpeta ftp para obtener este trabajo.

Según lo solicitado, la solución completa ahora será:

public bool DoesFtpDirectoryExist(string dirPath) { try { FtpWebRequest request = (FtpWebRequest)WebRequest.Create(dirPath); request.Method = WebRequestMethods.Ftp.ListDirectory; FtpWebResponse response = (FtpWebResponse)request.GetResponse(); return true; } catch(WebException ex) { return false; } } //Calling the method: string ftpDirectory = "ftp://ftpserver.com/rootdir/test_if_exist_directory/"; //Note: backslash at the last position of the path. bool dirExists = DoesFtpDirectoryExist(ftpDirectory);