2008-12-07 16 views

Respuesta

100
var request = (FtpWebRequest)WebRequest.Create 
    ("ftp://ftp.domain.com/doesntexist.txt"); 
request.Credentials = new NetworkCredential("user", "pass"); 
request.Method = WebRequestMethods.Ftp.GetFileSize; 

try 
{ 
    FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
} 
catch (WebException ex) 
{ 
    FtpWebResponse response = (FtpWebResponse)ex.Response; 
    if (response.StatusCode == 
     FtpStatusCode.ActionNotTakenFileUnavailable) 
    { 
     //Does not exist 
    } 
} 

Como regla general es una mala idea utilizar excepciones para la funcionalidad en su código como este, sin embargo, en este caso, creo que es una victoria para el pragmatismo. La lista de llamadas en el directorio tiene el potencial de ser mucho más ineficiente que usar excepciones de esta manera.

Si no lo hace, ¡tenga en cuenta que no es una buena práctica!

EDITAR: "¡Funciona para mí!"

Esto parece funcionar en la mayoría de los servidores ftp pero no en todos. Algunos servidores requieren enviar "TYPE I" antes de que el comando SIZE funcione. Uno habría pensado que el problema debe ser resuelto de la siguiente manera:

request.UseBinary = true; 

Por desgracia, es una de limitación de diseño (error grande grasa!) Que a menos FtpWebRequest está descargando o cargando un archivo que no enviará "TIPO I ". Consulte la discusión y la respuesta de Microsoft here.

Recomendaría utilizar el siguiente WebRequestMethod en su lugar, esto funciona para mí en todos los servidores que probé, incluso aquellos que no devolverían un tamaño de archivo.

WebRequestMethods.Ftp.GetDateTimestamp 
+0

Hola, He puesto mi usuario y mi contraseña y configuré mi URI. El archivo existe, pero este código indica que no existe –

+2

¡Eres realmente un genio ideado! ¡Funciona a las mil maravillas! –

+0

@ user42467, ¿Hay alguna razón para poner FtpWebResponse response = (FtpWebResponse) request.GetResponse(); dentro del intento, en lugar de solo request.GetResponse(); – Daniel

4

Debido

request.Method = WebRequestMethods.Ftp.GetFileSize 

mayo falla en algunos casos (550: TAMAÑO no se permite en modo ASCII), sólo puede comprobar marca de tiempo en su lugar.

reqFTP.Credentials = new NetworkCredential(inf.LogOn, inf.Password); 
reqFTP.UseBinary = true; 
reqFTP.Method = WebRequestMethods.Ftp.GetDateTimestamp; 
0

utilizo FTPStatusCode.FileActionOK para comprobar si existe el archivo ...

a continuación, en la sección "otra cosa", devuelve falso.

Cuestiones relacionadas