none
Verificar si un archivo remoto existe

    Frage

  • Buenas a todos:

    Como bien dice el titulo, el problema es que no puedo verificar si un archivo remoto existe.

    Lo que actualmente estoy haciendo es lo siguiente:


    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("url");
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();


    Ahora bien, si el archivo existe esta todo bien obtengo el response sin ningun problema. Pero si el archivo no existe me levanta una excepcion. Lo que no quiero es hacer un try para verificar que no existe. Queria saber si hay alguna manera que el request te diga si el archivo existe.

    Busque en la web y vi que request.Method = "HEAD" y despues obtienen el response y luego verifican el StatusCode del response. Lo quise hacer pero cuando intento obtener el response me sale la excepcion.

    Saludos a todos y gracias.

    Sparow
    Donnerstag, 26. November 2009 12:53

Antworten

  • Bueno, despues de romperme el coco tratando de hacerlo, decidi hacerlo a la inversa. Lo que hago es obtener el html completo del request que hago y sobre ese html busco los links. Asi obtengo todos los archivos remotos existentes. Y despues verifico si alguno de esos archivos tiene el mismo nombre que alguno de los archivos locales.
    Realmente me parece mucho mejor hacerlo de esta manera ya que tambien puedo descargar los archivos que no estan en el directorio local y que si en el remoto.

    Si lo quieren dar por cerrado por mi esta bien.

    Saludos
    Donnerstag, 17. Dezember 2009 20:05

Alle Antworten

  • hola

    en realidad podrias encapsular la logica de verificacion en una funcrion y dentro de esta utilziar el try..catch

    algo como se muesta en este link

    HttpWebRequest.GetResponse for "404 Not Found" and similar http status codes


    veras como crea el metodo

    podria ser algo como esto:

    public bool RemoteFileExist(string url)
    {
        HttpWebRequest req = HttpWebRequest.Create(url);
       
        try
        {
            HttpWebResponse response = req.GetResponse();
        }
        catch(System.Net.WebException ex)
        {
            if(ex.Status == WebExceptionStatus.ProtocolError)
                return false;
        }
       
        return true;
    }


    o sea usarias el control de errores pero no directo, sino encapsulado en una funcion, o como se denomina un helper que ayudara en esta validacion en particular


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Donnerstag, 26. November 2009 13:09
  • ¿No crees que pueda llegar haber otra manera de resolverlo Leandro?

    Si no hay otra manera, esta bien. Pero como que me duele terminar en un excepcion.

    Porque supuestamente en el status code del response se podria verificar si no se encontro.


    Sparow
    Donnerstag, 26. November 2009 13:13
  • hola

    segun puedo ver en el ejemplo del link:

    HttpWebResponse. StatusCode

    hace uso de try..catch

    pero me llamo la atencion en este otro ejemplo
    HttpStatusCode Enumeration

    puede validar el estado del response sin usar el catch, es asm hasta puede controlar el error 404

    aunque tal ves la linea esta
    httpReq.AllowAutoRedirect = false;
    tenga algo que ver

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Donnerstag, 26. November 2009 13:22
  • Si la verdad que es raro.

    Probe tratar de obtener el Response con AllowAutoRedirect en false y true y tambien sigue saltando la excepcion.
    No se si hay que setear alguna de las otras propiedades.
    Donnerstag, 26. November 2009 14:11
  • Una opcion es que controles el error que te regresa el request capturandolo en el web config con un custom error, algo asi:

    <error statusCode="404" redirect="mipaginaprincipal.htm" />

    un saludo

    Róbinson Moscoso



    Robinson Moscoso
    Montag, 7. Dezember 2009 13:44
  • Sparow, alguna novedad al respecto?


    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Visita Mi Blog C# XNA Sistemas Operativos
    Montag, 7. Dezember 2009 13:59
    Moderator
  • Actualmente lo estoy haciendolo con un try catch cuando intento obtener el response y el archivo no existe pero la verdad es que no me quede conforme. Supuestamente si un archivo no existe en el servidor el response no me deberia devolver una excepcion sino que cuando revise el StatusCode del response me diga StatusCode = 404.

    Si ven los ejemplos del link http://msdn.microsoft.com/en-us/library/system.net.httpstatuscode.aspx que puso Leandro
    veran que lo hacen verificando el StatusCode. He intentado hacer lo mismo pero la verdad es que no funciona.

    Saludos

    Sparow
    Montag, 7. Dezember 2009 14:06
  • mm y bien como vas con esto?



    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Visita Mi Blog C# XNA Sistemas Operativos
    Donnerstag, 17. Dezember 2009 19:35
    Moderator
  • Bueno, despues de romperme el coco tratando de hacerlo, decidi hacerlo a la inversa. Lo que hago es obtener el html completo del request que hago y sobre ese html busco los links. Asi obtengo todos los archivos remotos existentes. Y despues verifico si alguno de esos archivos tiene el mismo nombre que alguno de los archivos locales.
    Realmente me parece mucho mejor hacerlo de esta manera ya que tambien puedo descargar los archivos que no estan en el directorio local y que si en el remoto.

    Si lo quieren dar por cerrado por mi esta bien.

    Saludos
    Donnerstag, 17. Dezember 2009 20:05