¿Por qué se niega el acceso a la ruta?

156

Tengo un problema en el que intento eliminar mi archivo pero recibo una excepción.

if (result == "Success")
{
     if (FileUpload.HasFile)
     {
         try
         {
              File.Delete(Request.PhysicalApplicationPath + app_settings.login_images + txtUploadStatus.Text);
              string filename = Path.GetFileName(btnFileUpload.FileName);
              btnFileUpload.SaveAs(Request.PhysicalApplicationPath + app_settings.login_images + filename);
         }
         catch (Exception ex)
         {
               Message(ex.ToString());
         }
      }
}

También debo tener en cuenta que la carpeta que estoy tratando de eliminar tiene control total sobre los servicios de red.

El mensaje de excepción completo es:

System.UnauthorizedAccessException: se deniega el acceso a la ruta 'C: \ Users \ gowdyn \ Documents \ Visual Studio 2008 \ Projects \ hybrid \ hybrid \ temp_loginimages \ enviromental.jpg'. en System.IO .__ Error.WinIOError (Int32 errorCode, String maybeFullPath) en System.IO.File.Delete (String path) en hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click (Remitente de objetos, EventArgs e) en C: \ Users \ gowdy Documentos \ Visual Studio 2008 \ Proyectos \ hybrid \ hybrid \ User_Controls \ Imgloader_Add_Edit_Tbl.ascx.cs: línea 242

¿Algunas ideas?

Nick Gowdy
fuente
44
¿Qué no está claro sobre la excepción? La cuenta con la que se ejecuta la aplicación no tiene privilegios de acceso al archivo / carpeta.
Oded
8
Entiendo lo que dice la excepción. El problema es que esta funcionalidad es utilizada por algunos usuarios que necesitan modificar imágenes usando el sistema. Parte de eso es reemplazar imágenes eliminando la imagen anterior y guardando una nueva imagen.
Nick Gowdy
Verifique sus permisos de acceso a la carpeta. otorgue los permisos adecuados a la carpeta mediante la pestaña de seguridad de la ventana de propiedades
gasroot
66
La excepción no es informativa en absoluto. No le dice: A. Qué director está tratando de acceder al recurso B. Qué permiso necesita. Para averiguarlo, se requiere instalar Windows SysInternals y monitorear el acceso a la ruta.
ATL_DEV

Respuestas:

184

De acuerdo con el método File.Delete ...

Un UnauthorizedAccessExceptionsignifica una de 4 cosas:

  • La persona que llama no tiene el permiso necesario.
  • El archivo es un archivo ejecutable que está en uso.
  • La ruta es un directorio.
  • La ruta especificó un archivo de solo lectura.
CrazyTim
fuente
77
La ruta es un directorio. Vergonzoso para mí: /
Por G
44
Me pasó ayer facepalm . Odio estos mensajes de excepción ambiguos :(
Broken_Window
1
Estuve luchando por más de 6 horas y después de mirar su respuesta vi que la ruta era directorio ... muchas gracias @CrazyTim ..
Usuario M
66
Path is a directory.gracias por este consejo :) Me ayudó.
Sidron
8
Oh my ... Path es un directorio. Gracias Microsoft Eso es un acceso MUY no autorizado.
SeriousM
181

También tuve el problema, por lo tanto me topé con esta publicación. Agregué la siguiente línea de código antes y después de Copiar / Eliminar.

Eliminar

File.SetAttributes(file, FileAttributes.Normal);
File.Delete(file);

Copiar

File.Copy(file, dest, true);
File.SetAttributes(dest, FileAttributes.Normal);
Riaan de Lange
fuente
17
Le di a 'Todos' permisos completos para la carpeta sin éxito. De alguna manera, estos atributos de archivo funcionaron. Gracias. Desearía que MS finalmente se decidiera por un modelo de seguridad adecuado. Intentar descubrir por qué Copiar / Eliminar explota cada pocos años es frustrante por decir lo menos.
Steve
13
SetAttributes Normal fue el truco para mí: estaba tratando de File.Copy y sobrescribir un archivo de solo lectura ...
Tom Hunter
66
El acceso a la ruta denegado no sugiere que el archivo sea de solo lectura (¡ya que realmente tiene acceso a la ruta!) En mi opinión, el mensaje de error debería cambiarse. Gracias por la pista de todos modos!
MBoros
1
Ejecuté el programa como Administrador y el problema desapareció.
Santiago Villafuerte
55
¿Cómo ayuda establecer un atributo después de una operación de copia? ¿El programa no se bloqueará ya en la declaración de copia? ¿Debería ser antes de la operación de copia al igual que la operación de eliminación?
Vibhore Tanwer
31

Este es un problema antiguo, pero me encontré con él mientras buscaba. Resulta que me faltaba el componente de nombre de archivo real en la ruta de guardar para SaveAs ...

string uploadPath = Server.MapPath("~/uploads");
file.SaveAs(uploadPath); // BAD
file.SaveAs(Path.Combine(uploadPath, file.FileName)); // GOOD
Andrew Edvalson
fuente
18

Cuando un usuario intenta conectarse a su sitio web, IIS asigna la conexión a la cuenta IUSER_ComputerName , donde ComputerName es el nombre del servidor en el que se ejecuta IIS. De forma predeterminada, la cuenta IUSER_ComputerName es un miembro del grupo Invitados. Este grupo tiene restricciones de seguridad. Intente acceder a IUSER_ComputerName a esa carpeta

aquí hay una muy buena respuesta descrita sobre la seguridad de IIS

Espero que esto ayude

Arsen Mkrtchyan
fuente
Gracias, esto ayudó. Permiso para el usuario IIS_IUSRS.
Tom
13

Haga clic derecho en Visual Studio y haga clic en Ejecutar como administrador

Alexander Zaldostanov
fuente
Esta fue la solución para mi problema File.Move en una máquina Windows 8.1 Enterprise en la que yo era administrador local, y nada más tenía un control sobre los archivos.
Robert Kerr
13

Recibí el error porque no me di cuenta de que el destino debería ser un archivo. Tenía una carpeta como segundo parámetro (que funciona en cmd). y obtuve Unhandled Exception: System.UnauthorizedAccessException: Access to the path is denied.porque C # File.Movequiere un archivo allí, no solo para el primer parámetro, sino también para el segundo, por lo que si coloca un directorio como segundo parámetro, está tratando de escribir un archivo como c:\crpcuando tiene un directorio llamadoc:\crp .

esto sería incorrecto File.Move(args[0],"c:\\crp");

Entonces, esto sería correcto File.Move(args[0],"c:\\crp\\a.a");

Lo mismo va para File.Copy

barlop
fuente
1
¡Gracias! Esto resolvió indirectamente un problema en el que una API esperaba un destino que le di como directorio, sin darme cuenta de que tenía que incluir el nombre de archivo (ya que el objeto en sí tiene un nombre de archivo asociado).
Austin Salgat
7

Si este es un sitio web de IIS que tiene el problema, verifique la propiedad Identidad de la configuración avanzada para el grupo de aplicaciones que utiliza el sitio o la aplicación. Puede encontrar que está configurado en ApplicationPoolIdentity, y en ese caso, este es el usuario que tendrá que tener acceso a la ruta.

O puede seguir el estilo antiguo y simplemente configurar la Identidad en el Servicio de red y otorgarle al usuario del Servicio de red acceso a la ruta.

Bjørn Otto Vasbotten
fuente
3

Debe modificar los privilegios de la carpeta de la que está tratando de eliminar / guardar. Haga clic con el botón derecho en la carpeta que contiene y use la pestaña Seguridad para permitir modificar los derechos del usuario con el que se ejecuta su aplicación.

Cerdas
fuente
está asumiendo que él es el administrador de su máquina ... si esta es una máquina de trabajo y él es solo un usuario ... probablemente configuraron los permisos de esa manera por una razón ... ya que solo nos queda asumir
MethodMan
1
Es una máquina de trabajo y soy un usuario avanzado. No inicio sesión como administrador. Las propiedades de la carpeta de imágenes se han modificado para que los servicios de red tengan acceso completo. Pero eso no hizo ninguna diferencia.
Nick Gowdy
1
Acabo de agregar "Todos" con acceso completo a la carpeta y "voilá"
MarceloBarbosa
3

La excepción que se produce cuando el sistema operativo niega el acceso debido a un error de E / S o un tipo específico de error de seguridad.

Golpeé lo mismo. Verifique para asegurarse de que el archivo NO ESTÉ OCULTO.

Ron H
fuente
3

También me enfrenté a este problema cuando mi servicio de ventana comenzó a arrojar la excepción

System.UnauthorizedAccessException: Access to the path "C:\\Order\\Media
44aa4857-3bac-4a18-a307-820450361662.mp4" is denied.

Entonces, como solución, verifiqué la cuenta de usuario asociada con mi servicio, como se muestra en la siguiente captura de pantalla

ingrese la descripción de la imagen aquí

Entonces en mi caso fue SERVICIO DE RED

Y luego fui a las propiedades de la carpeta para verificar si la cuenta de usuario asociada también existe en su pestaña de permiso. Faltaba en mi caso y cuando lo agregué y solucionó mi problema.

Para obtener más información, consulte la siguiente captura de pantalla

ingrese la descripción de la imagen aquí

Jitender Kumar
fuente
3

El mismo problema para mí también, estaba señalando la carpeta en lugar del archivo.

así que asegúrate en ruta, da ruta + nombre de archivo

System.IO.File.WriteAllBytes("path", bytearray);
jineesh vp
fuente
2

Verifique las propiedades de sus archivos. Si la opción de solo lectura está marcada, desactívela. Este fue mi problema personal con la excepción de acceso no autorizado.

usuario3238433
fuente
2

Recibí este error y lo resolví en un momento. No sé por qué todas mis carpetas son de solo lectura, cancelé la de solo lectura y la apliqué. Sin embargo, todavía es de solo lectura. Así que moví el archivo a la carpeta raíz, funciona, es muy extraño.

MOLLMY
fuente
2

Se produce una excepción UnauthorizedAccessException cuando el sistema operativo niega el acceso debido a un error de E / S o un error de seguridad.

Si está intentando acceder a un archivo o clave de registro, asegúrese de que no sea de solo lectura .

reza.Nikmaram
fuente
2

Si está utilizando BitDefender, existe una buena posibilidad de que su función de Archivos seguros bloquee su operación. Esta es una forma de protección contra ransomware que viene con algunas de sus versiones más avanzadas.

Asegúrese de otorgar acceso a su aplicación en BitDefender e intente nuevamente.

Puede encontrar más detalles en esta página de soporte de BitDefender .

Vlad Schnakovszki
fuente
1

Tuve el mismo problema en un sitio web recientemente movido en un servidor compartido. Resuelto a través de la configuración del panel de host web (DotNetPanel) verdadero "permitir permisos de escritura". Entonces, si está en un servidor compartido antes de revisar todo el código, vale la pena echarle un vistazo a la configuración del servidor y podría ahorrarle mucho tiempo.

Drakell
fuente
1

Tenga en cuenta que si está intentando alcanzar una ruta de carpeta compartida desde su código, no solo necesita otorgar los permisos adecuados a la carpeta física a través de la pestaña de seguridad. También debe "compartir" la carpeta con el usuario del grupo de aplicaciones correspondiente a través de la pestaña Compartir

Kacho
fuente
1

Estaba enfrentando este error porque

A veces, cuando Combinela ruta con el nombre del archivo yFileName = ""

Que se convierta en Path Directoryno una fileque es un problema que se ha mencionado anteriormente

así que debes comprobarlo FileNameasí

if(itemUri!="")
        File.Delete(Path.Combine(RemoteDirectoryPath, itemUri));
Basheer AL-MOMANI
fuente
1

Tuve el error exacto al eliminar un archivo. Era un servicio de Windows que se ejecutaba bajo una cuenta de servicio que no podía eliminar un documento .pdf de una carpeta compartida a pesar de que tenía el control total de la carpeta.

Lo que funcionó para mí fue navegar a la pestaña Seguridad de la carpeta compartida> Avanzado> Compartir> Agregar.

Luego agregué la cuenta de servicio al grupo de administradores, apliqué los cambios y la cuenta de servicio pudo realizar todas las operaciones en todos los archivos dentro de esa carpeta.

LuTheZy
fuente
1

Para aquellos que intentan crear una aplicación para UWP (Windows universal), los permisos de los archivos están mucho más restringidos y, en general, están denegados de manera predeterminada. También reemplaza los permisos de usuario del sistema. Básicamente, solo tendrá acceso a los archivos en

  • Tu ubicación de instalación
  • Su ubicación de AppData
  • Archivos seleccionados a través del selector de archivo o carpeta
  • Lugares solicitados en su manifiesto de aplicación

Puede leer más aquí para más detalles => https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions

Tezra
fuente
1

En mi caso, el problema era Norton. Mi programa interno no tiene la firma digital adecuada y cuando trató de eliminar un archivo, dio la excepción de acceso no autorizado.

ingrese la descripción de la imagen aquí

Si le da una notificación, puede manejarlo desde allí. En mi caso no dio una notificación que noté. Así que aquí se explica cómo evitar que Norton bloquee el programa.

  1. Abrir Norton
  2. Haz clic en la flecha hacia abajo.
  3. Haga clic en Historial
  4. Encuentra actividad por programa
  5. Haz clic en Más opciones
  6. Haga clic en Excluir proceso
D_Bester
fuente
0

Yo también enfrenté el mismo problema al intentar hacer esto después de la implementación en el servidor:

dirPath = Server.MapPath(".") + "\\website\\" + strUserName;
if (!Directory.Exists(dirPath))
{
    DirectoryInfo DI = Directory.CreateDirectory(dirPath);
}
string filePath = Server.MapPath(".") + "\\Website\\default.aspx";
File.Copy(filePath, dirPath + "\\default.aspx", true);
File.SetAttributes(dirPath + "\\default.aspx", FileAttributes.Normal);

Otorgué permiso en IIS a otro grupo, incluido el administrador, y mi problema se resolvió.

Manish Singh
fuente
0

He encontrado que este error puede ocurrir en MODO DE DISEÑO en lugar de? modo de ejecución ... Si está haciendo algo como crear un miembro de la clase que requiere acceso a un archivo .INI o .HTM (archivo de configuración, archivo de ayuda) es posible que NO desee inicializar el elemento en la declaración, pero inicializarlo más tarde en FORM_Load () etc ... Cuando INICIAS ... Usa una declaración de protección IF:

    /// <summary>FORM: BasicApp - Load</summary>
    private void BasicApp_Load(object sender, EventArgs e)
    {
        // Setup Main Form Caption with App Name and Config Control Info
        if (!DesignMode)
        {
            m_Globals = new Globals();
            Text = TGG.GetApplicationConfigInfo();
        }
    }

Esto evitará que el Diseñador MSVS intente crear un archivo INI o HTM cuando esté en modo de diseño.

Terry
fuente
0

Recibí este error cuando intenté cambiar el nombre de una carpeta muy rápidamente después de que se había movido o creado.

Un simple lo System.Threading.Thread.Sleep(500);resolvió:

void RenameFile(string from, string to)
{
   try
   {   
      System.IO.File.Move(from, to)      
   }   
   catch 
   {  
       System.Threading.Thread.Sleep(500);      
       RenameFile(from, to);      
   }   
}
Arjan de Bruijn
fuente
Piense que sería mejor si verificara si la carpeta existía antes de moverla en lugar de dormir durante medio segundo ... si el sistema operativo está ocupado, el movimiento anterior podría tomar más de medio segundo y volver al mismo problema.
Paul Zahra
Este código es muy peligroso. Repite el método RenameFile sin importar qué excepción se produzca. Podría causar que la aplicación se bloquee si la causa de la excepción es un problema de permiso real
Hossein Shahdoost
0

En mi caso particular, repetidamente estaba creando y eliminando 10000 carpetas. Me parece que el problema estaba en que, aunque el método Directory.Delete(path, true)vuelve, el mecanismo subyacente del sistema operativo aún puede eliminar los archivos del disco. Y cuando empiezo a crear nuevas carpetas inmediatamente después de eliminar las antiguas, algunas de ellas siguen bloqueadas porque todavía no se han eliminado por completo. Y obtengo System.UnauthorizedAccessException: "Se deniega el acceso a la ruta".

ingrese la descripción de la imagen aquí

Usar Thread.Sleep(5000)after Directory.Delete(path, true)resuelve ese problema. Estoy totalmente de acuerdo en que esto no es seguro, y no estoy alentando a nadie a usarlo. Me encantaría tener un mejor enfoque para resolver este problema y mejorar mi respuesta. Ahora solo estoy dando una idea de por qué puede ocurrir esta excepción.

class Program
{
    private static int numFolders = 10000;
    private static string rootDirectory = "C:\\1";

    static void Main(string[] args)
    {
        if (Directory.Exists(rootDirectory))
        {
            Directory.Delete(rootDirectory, true);
            Thread.Sleep(5000);
        }

        Stopwatch sw = Stopwatch.StartNew();
        CreateFolder();
        long time = sw.ElapsedMilliseconds;

        Console.WriteLine(time);
        Console.ReadLine();
    }

    private static void CreateFolder()
    {
        var one = Directory.CreateDirectory(rootDirectory);

        for (int i = 1; i <= numFolders; i++)
        {
            one.CreateSubdirectory(i.ToString());
        }
    }
}
Aleksei Mialkin
fuente
0

Primero solo verifique la ruta si falta el carácter de dos puntos (:) o no después de la letra de la unidad. Si no faltan los dos puntos, puede verificar si se otorga permiso de acceso / escritura para esa ruta. Tuve el mismo problema y solo me faltaban los dos puntos, el permiso y todo lo demás estaba bien.

C:\folderpath

funcionará bien pero,

C\folderpath .........(missing colon)

le dará error de denegación de acceso.

Vijay Dodamani
fuente
0

Estaba tratando de usar System.IO.File.OpenWrite (ruta)

y no funcionó porque solo estaba pasando OpenWrite () una ruta a un directorio, pero requiere una ruta hasta el archivo que desea escribir. Por lo tanto, una ruta completa que incluye el nombre de archivo. Extensión al final debe pasarse a OpenWrite para evitar una excepción de acceso no autorizado

SeanMC
fuente
0

También me encontré con esta publicación por tratar el mismo problema. Parece que el archivo está en uso y, por lo tanto, no puede escribir en él. Aunque no es capaz de resolverlo, qué proceso lo está utilizando. Cerró la sesión del otro usuario que inició sesión en ese cuadro, no ve ningún usuario que lo tenga. Algún consejo rápido sobre cómo encontrar lo mismo.

Gracias, Lakshay (desarrollador)

Lakshay Gupta
fuente
En su respuesta, no publique una nueva pregunta, pero trate de responder la pregunta del póster original con información útil. Para su propia pregunta, busque stackoverflow primero para las mismas preguntas o preguntas similares. Si no encuentra ninguna, publique una nueva pregunta siguiendo esta guía: Cómo hacer una buena pregunta
alev
0

Para resolver este problema, sigo el enfoque de Scot Hanselman en Debugging System.UnauthorizedAccessException (seguido a menudo por: Acceso al camino denegado) artículo, el código con el siguiente ejemplo es el siguiente:

class Program
{
    static void Main(string[] args)
    {
        var path = "c:\\temp\\notfound.txt";
        try
        {
            File.Delete(path);
        }
        catch (UnauthorizedAccessException)
        {
            FileAttributes attributes = File.GetAttributes(path);
            if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
            {
                attributes &= ~FileAttributes.ReadOnly;
                File.SetAttributes(path, attributes);
                File.Delete(path);
            }
            else
            {
                throw;
            }
        }
    }
}
Antonio Leonardo
fuente