none
Error al ejecutar la función WriteAllBytes RRS feed

  • Pregunta

  • Buenas. Tengo un problema, estoy haciendo una función para guardar un archivo pdf en una base de datos SQL Server y al ejecutar la función:

    File.WriteAllBytes(Application.StartupPath, Datos);

    Me da el error System.UnauthorizedAccessException: 'Acceso denegado a la ruta de acceso.

    Este es el código completo:

    Cargar el archivo en el base de datos:

                String ruta;
    
                OpenFileDialog op = new OpenFileDialog();
    
                op.AddExtension = true;
                op.InitialDirectory = "";
                op.ShowDialog();
    
                ruta = op.FileName;
    
                FileStream stream = new FileStream(ruta, FileMode.Open, FileAccess.Read);
    
                BinaryReader br = new BinaryReader(stream);
                FileInfo fi = new FileInfo(ruta);
    
                byte[] binData = new byte[stream.Length - 1 + 1];
                stream.Read(binData, 0, Convert.ToInt32(stream.Length));
    
                SqlConnection SqlConexion = new SqlConnection(CapaDatos.DConexion.CnBDEmpresa);
                SqlConexion.Open();
    
                SqlCommand SqlComando = new SqlCommand();
                SqlComando.Connection = SqlConexion;
                SqlComando.CommandText = "UPDATE ordenesCompra SET presupuesto=@archivo WHERE ID = @ID";
                SqlComando.CommandType = CommandType.Text;
    
                SqlComando.Parameters.AddWithValue("@ID", 1);
                SqlComando.Parameters.AddWithValue("@archivo", binData);
    
                SqlComando.ExecuteNonQuery();

    Y al leer el archivo hago así:

    MemoryStream stream;
    
                SqlConnection SqlConexion = new SqlConnection(CapaDatos.DConexion.CnBDEmpresa);
                SqlConexion.Open();
    
                SqlCommand SqlComando = new SqlCommand();
                SqlComando.Connection = SqlConexion;
                SqlComando.CommandText = "SELECT presupuesto FROM ordenesCompra WHERE ID = @ID";
                SqlComando.CommandType = CommandType.Text;
    
                SqlComando.Parameters.AddWithValue("@ID", 1);
    
                SqlComando.ExecuteNonQuery();
    
                SqlDataAdapter dp = new SqlDataAdapter(SqlComando);
                DataSet ds = new DataSet("presupuesto");
    
                byte[] Datos = new Byte[0];
    
                dp.Fill(ds, "ordenesCompra");
    
                DataRow myRow = ds.Tables["ordenesCompra"].Rows[0];
    
                Datos = (byte[])myRow["presupuesto"];
                stream = new MemoryStream(Datos);
    
                SqlDataReader reader = SqlComando.ExecuteReader();
    
                File.WriteAllBytes(Application.StartupPath, Datos);

    No se porque falla en la última linea al crearlo.

    Espero sus respuestas. Saludos y gracias :D


    Skull

    jueves, 20 de agosto de 2020 23:08

Respuestas

  • File.WriteAllBytes(Application.StartupPath, Datos);

    [...] Acceso denegado a la ruta de acceso.

    "Application.StartupPath" es la ruta donde se encuentra el ejecutable del programa. Lo más normal es que para un programa en producción, esta ruta no tenga permiso de escritura para los usuarios no privilegiados.

    Esto se hace por razones de seguridad. Si los usuarios pudieran escribir en la ruta donde se encuentran los ejecutables de los programas, podrían modificar éstos, causando toda clase de riesgos para la seguridad del sistema (posiblemente compartido con otros usuarios).

    Desde luego, si tienes suficientes privilegios en el sistema (por ejemplo, eres Administrador del mismo), puedes modificar los permisos y concederte a ti mismo (o a otros) acceso sobre esa carpeta. Una forma sencilla de tener acceso a ella es lanzar el ejecutable de tu programa con la opción "ejecutar como administrador", que le dará permiso de acceso a la carpeta donde ahora recibes "acceso denegado".

    ¿Es esto buena idea? No. Aunque funciona, supone un riesgo para la seguridad del sistema. Lo adecuado es que modifiques tu programa para que no salve el archivo en su propia carpeta, sino que lo salve en algún sitio adecuado conforme con el diseño de la seguridad en Windows. Por ejemplo, puedes usar una subcarpeta por debajo de "Mis Documentos".


    domingo, 23 de agosto de 2020 10:25
    Moderador

Todas las respuestas

  • Hola Skull15101996,

    Te dejo este enlace que explica como resolver este problema, espero que te sea de ayuda. Quedo pendiente de cualquier actualización. Gracias por levantar tu consulta en los foros de msdn.

     

    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. 

    viernes, 21 de agosto de 2020 0:47
    Moderador
  • Hola. No me funcionó, sigue fallando.

    Skull

    viernes, 21 de agosto de 2020 22:01
  • Hola. Revisa que tengas permisos de escritura en dicha carpeta.

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    domingo, 23 de agosto de 2020 9:11
    Moderador
  • File.WriteAllBytes(Application.StartupPath, Datos);

    [...] Acceso denegado a la ruta de acceso.

    "Application.StartupPath" es la ruta donde se encuentra el ejecutable del programa. Lo más normal es que para un programa en producción, esta ruta no tenga permiso de escritura para los usuarios no privilegiados.

    Esto se hace por razones de seguridad. Si los usuarios pudieran escribir en la ruta donde se encuentran los ejecutables de los programas, podrían modificar éstos, causando toda clase de riesgos para la seguridad del sistema (posiblemente compartido con otros usuarios).

    Desde luego, si tienes suficientes privilegios en el sistema (por ejemplo, eres Administrador del mismo), puedes modificar los permisos y concederte a ti mismo (o a otros) acceso sobre esa carpeta. Una forma sencilla de tener acceso a ella es lanzar el ejecutable de tu programa con la opción "ejecutar como administrador", que le dará permiso de acceso a la carpeta donde ahora recibes "acceso denegado".

    ¿Es esto buena idea? No. Aunque funciona, supone un riesgo para la seguridad del sistema. Lo adecuado es que modifiques tu programa para que no salve el archivo en su propia carpeta, sino que lo salve en algún sitio adecuado conforme con el diseño de la seguridad en Windows. Por ejemplo, puedes usar una subcarpeta por debajo de "Mis Documentos".


    domingo, 23 de agosto de 2020 10:25
    Moderador
  • hola

    >>No se porque falla en la última linea al crearlo.

    Cual es el nombre del archivo pdf ? te esta faltando algo como ser

    string fullpath = Path.Combine(Application.StartupPath, "nombredoc.pdf");

    File.WriteAllBytes(fullpath, Datos);

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 24 de agosto de 2020 3:11
  • Hola Skull15101996,

    ¿Alguna novedad sobre la consulta realizada?

     

    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. 

    viernes, 28 de agosto de 2020 1:13
    Moderador