none
UnauthorizedAccessException: Acceso denegado a la ruta de acceso 'C:\log.txt'. RRS feed

  • Pregunta

  •  Hola como andan, estoy tratando de guardar las excepciones en un txt, y asignarle una ruta, y si la ruta no existe crearla, pero me da una excepcion y no se como darle permisos. alguien sabe como solucionar esta excepcion me la la excepcion empezando el using

    public void Guardar()
            {
    
    
                try
                {
                    string rutaDoc = string.Format(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
                    string rutaAlt = @"\SegundoParcialUtn\JardinUtn\Archivos";
                    string ruta = Path.Combine(rutaDoc, rutaAlt);
                    System.IO.Directory.CreateDirectory(ruta);
                    FileIOPermission filePermissions =new FileIOPermission(FileIOPermissionAccess.Write, @"C:\Program Files\");
                    filePermissions.Demand();
                    using (StreamWriter writer = new StreamWriter(Path.Combine(ruta, @"\log.txt"),true))<-------------
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.AppendLine(DateTime.Now.ToString() + ":");
                        sb.AppendLine(this.Message);
                        Exception innerException = this.InnerException;
                        while (innerException != null)
                        {
                            sb.AppendLine(innerException.Message);
                            innerException = innerException.InnerException;
                        }
                        writer.Write(sb.ToString());
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception("No se pudo guardar", ex);
                }
            }
    
                


    martes, 7 de julio de 2020 5:48

Todas las respuestas

  • ¿Seguro que el error te sale en el using y no en la línea anterior?

    En el using lo que hace es crear el archivo en la ruta indicada, cosa que ciertamente puede ocasionar un error si no tienes permiso, pero es raro que no lo tengas porque ya te habría dado un error un poco antes en la línea que crea el directorio. Y aunque es posible tener permiso para crear un directorio y no tenerlo para crear ficheros en el directorio, es algo muy poco común; me extraña que te esté sucediendo salvo que previamente hayas creado el directorio a mano y hayas estado manipulando sus permisos.

    En cambio, en el filePermissions.Demand sí que es normal que te dé un error. Está pidiendo permisos de escritura en Archivos de Programa, y lo normal es que un programa que no se ejecute con elevación de privilegios NO tenga permiso sobre esa ruta. Así que sí que sería muy normal que ahí diera un error.

    Habría sido útil que hubieras copiado en tu pregunta el mensaje de error completo, exacto y detallado (incluyendo la traza de pila y el texto completo de la excepción), porque eso nos habría dado más información de cara a determinar las causas más probables.

    Por cierto, otra cosa: Has puesto la pregunta en el foro de ASP.NET, pero en el programa estás construyendo una ruta a la carpeta "Mis Documentos", que solo tiene sentido para una aplicación de escritorio. Si la aplicación ASP.NET se ejecuta bajo una cuenta de servicios, ¿qué esperas que devuelva en "Mis Documentos"? La cuenta de servicio no tiene una carpeta "Mis Documentos".

    martes, 7 de julio de 2020 7:27
  • Hola mishaker22, voy a investigar tu consulta.

     

    Saludos cordiales

     

    Gabriel Castro

    martes, 7 de julio de 2020 12:54
    Moderador
  • Hola mishaker22, voy a investigar tu consulta.

     

    Saludos cordiales

     

    Gabriel Castro

    Seria de gran ayuda gracias
    martes, 7 de julio de 2020 14:00
  • ¿Seguro que el error te sale en el using y no en la línea anterior?

    En el using lo que hace es crear el archivo en la ruta indicada, cosa que ciertamente puede ocasionar un error si no tienes permiso, pero es raro que no lo tengas porque ya te habría dado un error un poco antes en la línea que crea el directorio. Y aunque es posible tener permiso para crear un directorio y no tenerlo para crear ficheros en el directorio, es algo muy poco común; me extraña que te esté sucediendo salvo que previamente hayas creado el directorio a mano y hayas estado manipulando sus permisos.

    En cambio, en el filePermissions.Demand sí que es normal que te dé un error. Está pidiendo permisos de escritura en Archivos de Programa, y lo normal es que un programa que no se ejecute con elevación de privilegios NO tenga permiso sobre esa ruta. Así que sí que sería muy normal que ahí diera un error.

    Habría sido útil que hubieras copiado en tu pregunta el mensaje de error completo, exacto y detallado (incluyendo la traza de pila y el texto completo de la excepción), porque eso nos habría dado más información de cara a determinar las causas más probables.

    Por cierto, otra cosa: Has puesto la pregunta en el foro de ASP.NET, pero en el programa estás construyendo una ruta a la carpeta "Mis Documentos", que solo tiene sentido para una aplicación de escritorio. Si la aplicación ASP.NET se ejecuta bajo una cuenta de servicios, ¿qué esperas que devuelva en "Mis Documentos"? La cuenta de servicio no tiene una carpeta "Mis Documentos".

    Antes de poner el filePermissions.Demand tambien llegaba al using  y me mandaba al catch, solo puse eso porque lo vi en un foro jaja pero en realidad no funciono tampoco.

    puede ser que pase eso que dices que tengo permisos de crear carpeta pero no de hacer lo otro, en ese caso que podria hacer?,en realidad solo necesito que cree esa ruta en documentos, pero si por alguna razon me da esa excepcion, cuando llega al using es cuando me manda al catch no se que ocurre realmente,


    martes, 7 de julio de 2020 14:03
  • ¿Seguro que el error te sale en el using y no en la línea anterior?

    En el using lo que hace es crear el archivo en la ruta indicada, cosa que ciertamente puede ocasionar un error si no tienes permiso, pero es raro que no lo tengas porque ya te habría dado un error un poco antes en la línea que crea el directorio. Y aunque es posible tener permiso para crear un directorio y no tenerlo para crear ficheros en el directorio, es algo muy poco común; me extraña que te esté sucediendo salvo que previamente hayas creado el directorio a mano y hayas estado manipulando sus permisos.

    En cambio, en el filePermissions.Demand sí que es normal que te dé un error. Está pidiendo permisos de escritura en Archivos de Programa, y lo normal es que un programa que no se ejecute con elevación de privilegios NO tenga permiso sobre esa ruta. Así que sí que sería muy normal que ahí diera un error.


    Tampoco cree los directorios antes , esperaba que me los creara solo a ver si me funcionaba, pero no tampoco
    martes, 7 de julio de 2020 14:07
  • en realidad solo necesito que cree esa ruta en documentos

    Pero en documentos... ¿de quién? ¿No es una aplicación ASP.NET? En estas aplicaciones los usuarios de la aplicación no tienen una carpeta de documentos.

    martes, 7 de julio de 2020 15:35
  • Hola mishaker22,

    Podrías probar con este código a ver si te ayuda a resolver tu problema. Crea una función que contenga esto y llámala dentro de tus catchs:


    string filePath = @"C:\Error.txt";
    
    Exception ex = ...
    
    using( StreamWriter writer = new StreamWriter( filePath, true ) )
    {
        writer.WriteLine( "-----------------------------------------------------------------------------" );
        writer.WriteLine( "Date : " + DateTime.Now.ToString() );
        writer.WriteLine();
    
        while( ex != null )
        {
            writer.WriteLine( ex.GetType().FullName );
            writer.WriteLine( "Message : " + ex.Message );
            writer.WriteLine( "StackTrace : " + ex.StackTrace );
    
            ex = ex.InnerException;
        }
    }


    Aquí vas a guardar el documento en C, ubicación que sabemos que existe a ver si te devuelve algún error y de ser así, si es el mismo error. Si te funciona, adáptala para que pueda funcionar con ubicaciones que podrían no existir y prueba de nuevo (algo similar a esto):


    string filePath = @"C:\Error.txt";
    
    Exception ex = ...
    if (!Directory.Exists(dir))
    {
        Directory.CreateDirectory(dir);
    	//el resto del código anterior
    }


    Saludos cordiales

     

    Gabriel Castro

     ____________________________ 

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    martes, 7 de julio de 2020 17:56
    Moderador
  • Hola mishaker22

    ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las  respuestas proporcionadas?  

    Espero tu respuesta.  

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN.  

    Gabriel Castro
    jueves, 9 de julio de 2020 19:38
    Moderador