Por que o acesso ao caminho é negado?

156

Estou com um problema no qual estou tentando excluir meu arquivo, mas recebo uma exceção.

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());
         }
      }
}

Também devo observar que a pasta da qual estou tentando excluir tem controle total dos serviços de rede.

A mensagem de exceção completa é:

System.UnauthorizedAccessException: o acesso ao caminho 'C: \ Usuários \ arquivo \ Documents \ Visual Studio 2008 \ Projetos \ híbrido \ híbrido \ híbrido \ temp_loginimages \ enviromental.jpg' foi negado. em System.IO .__ Error.WinIOError (Int32 errorCode, String maybeFullPath) em System.IO.File.Delete (caminho da String) em hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click (remetente do objeto, EventArgs e) em C: \ Users \ gowdyn \ Documents \ Visual Studio 2008 \ Projetos \ híbrido \ híbrido \ Controles do usuário \ Imgloader_Add_Edit_Tbl.ascx.cs: linha 242

Alguma ideia?

nick gowdy
fonte
4
O que não está claro sobre a exceção? A conta em que o aplicativo está sendo executado não possui privilégios de acesso ao arquivo / pasta.
Oded
8
Eu entendo o que a exceção está dizendo. O problema é que essa funcionalidade é usada por alguns usuários que precisam modificar imagens usando o sistema. Parte disso é substituir as imagens excluindo a imagem antiga e salvando uma nova imagem.
nick Gowdy
Verifique suas permissões de acesso à pasta. dar as permissões adequadas para a pasta usando guia de segurança de propriedades janela
gasroot
6
A exceção não é de todo informativa. Ele não informa: A. Qual diretor está tentando acessar o recurso B. Que permissão ele precisa. Para descobrir, é necessário instalar o Windows SysInternals e monitorar o acesso ao caminho.
ATL_DEV

Respostas:

184

De acordo com o método File.Delete ...

Um UnauthorizedAccessExceptionsignifica uma das quatro coisas:

  • O chamador não tem a permissão necessária.
  • O arquivo é um arquivo executável que está em uso.
  • Caminho é um diretório.
  • O caminho especificou um arquivo somente leitura.
CrazyTim
fonte
77
Caminho é um diretório. Embaraçoso para mim: /
Por G
4
Aconteceu comigo ontem facepalm . Eu odeio essas mensagens de exceção ambíguas :( #
3133 Broken_Window
1
Eu estava lutando por mais de 6 horas e depois de olhar para a sua resposta viu que o caminho era diretório ... Graças a tonelada @CrazyTim ..
Usuário M
6
Path is a directory.obrigado por esta dica :) Isso me ajudou.
Sidron
8
Oh meu ... Path é um diretório. Obrigado Microsoft. É um acesso MUITO não autorizado.
SeriousM
181

Eu também tive o problema, por isso me deparei com este post. Adicionei a seguinte linha de código antes e depois de uma cópia / exclusão.

Excluir

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

cópia de

File.Copy(file, dest, true);
File.SetAttributes(dest, FileAttributes.Normal);
Riaan de Lange
fonte
17
Dei permissões completas a 'Todos' para a pasta sem êxito. De alguma forma, esses atributos de arquivo funcionaram. Obrigado. Eu gostaria que a MS finalmente decidisse por um modelo de segurança adequado. Tentar descobrir por que o Copy / Delete explode a cada poucos anos é frustrante, para dizer o mínimo.
Steve
13
SetAttributes normal era o truque para mim - eu estava tentando File.Copy e substituir um arquivo somente leitura ..
Tom Hunter
6
O acesso ao caminho é negado não sugere que o arquivo seja simplesmente somente leitura (já que você realmente tem acesso ao caminho!). Na minha opinião, a mensagem de erro deve ser alterada. Obrigado pela dica de qualquer maneira!
MBoros
1
Executei o programa como administrador e o problema desapareceu.
Santiago Villafuerte
5
Como a configuração de um atributo após uma operação de cópia ajuda? O programa já não trava na declaração de cópia? Deveria ser antes da operação de cópia, assim como a operação de exclusão?
Vibhore Tanwer
31

Esse é um problema antigo, mas eu o encontrei enquanto pesquisava. Acontece que estava faltando o componente de nome de arquivo real no caminho para salvar SaveAs ...

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

Quando um usuário tenta se conectar ao seu site, o IIS atribui a conexão à conta IUSER_ComputerName , em que ComputerName é o nome do servidor no qual o IIS está sendo executado. Por padrão, o IUSER_ComputerName conta é um membro do grupo Convidados. Este grupo tem restrições de segurança. Tente acessar o IUSER_ComputerName nessa pasta

Aqui está uma resposta muito boa descrita sobre a segurança do IIS

Espero que isto ajude

Arsen Mkrtchyan
fonte
Graças a isso ajudou .. Permissão para o usuário IIS_IUSRS.
Tom
13

Clique com o botão direito do mouse no Visual studio e clique em Executar como Administrador

Alexander Zaldostanov
fonte
Esta foi a solução para o meu problema no File.Move em uma máquina Windows 8.1 Enterprise na qual eu era administrador local e nada mais tinha controle sobre os arquivos.
Robert Kerr
13

Eu recebi o erro porque não percebi que o destino deveria ser um arquivo. Eu tinha uma pasta como o segundo parâmetro (que funciona no cmd). e consegui Unhandled Exception: System.UnauthorizedAccessException: Access to the path is denied.porque o C # File.Movequer um arquivo lá, não apenas para o primeiro parâmetro, mas também para o segundo e, portanto, se você colocar um diretório como segundo parâmetro, ele está tentando gravar um arquivo como c:\crpquando você tem um diretório chamado c:\crp.

isso seria incorreto File.Move(args[0],"c:\\crp");

Então, isso estaria correto File.Move(args[0],"c:\\crp\\a.a");

O mesmo vale para File.Copy

barlop
fonte
1
Obrigado! Isso resolveu indiretamente um problema em que uma API esperava um destino que eu forneci como diretório, sem perceber que tinha que incluir o nome do arquivo (já que o próprio objeto tem um nome de arquivo associado).
Austin Salgat 5/10
7

Se este é um site do IIS com problemas, verifique a propriedade Identity das configurações avançadas do pool de aplicativos que o site ou aplicativo usa. Você pode achar que está definido como ApplicationPoolIdentity e, nesse caso, esse é o usuário que precisará acessar o caminho.

Ou você pode seguir o estilo antigo e simplesmente definir a Identidade como Serviço de rede e conceder ao usuário do Serviço de rede acesso ao caminho.

Bjørn Otto Vasbotten
fonte
3

Você precisa modificar os privilégios da pasta que está tentando excluir de / salvar em. Clique com o botão direito do mouse na pasta que contém e use a guia Segurança para permitir direitos de modificação para o usuário no qual seu aplicativo é executado.

Brissles
fonte
você está assumindo que ele é o administrador de sua máquina .. se esta é uma máquina de trabalho e ele é apenas um usuário .. eles provavelmente configuram as permissões dessa maneira por um motivo .. desde que nos resta assumir
MethodMan
1
É uma máquina de trabalho e eu sou um usuário avançado. Não logo como administrador. As propriedades da pasta da imagem foram modificadas para que os serviços de rede tenham acesso total. Mas isso não fez nenhuma diferença.
nick Gowdy
1
Acabei de adicionar "Todos" com acesso total à pasta e "voilá"
MarceloBarbosa 17/17/17
3

A exceção que é lançada quando o sistema operacional nega o acesso devido a um erro de E / S ou a um tipo específico de erro de segurança.

Eu bati na mesma coisa. Verifique se o arquivo NÃO ESTÁ ESCONDIDO.

Ron H
fonte
3

Também enfrentei esse problema quando meu serviço de janela começou a lançar a exceção

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

Portanto, como solução, verifiquei a conta de usuário associada ao meu serviço, conforme mostrado na captura de tela abaixo

insira a descrição da imagem aqui

Então, no meu caso, era SERVIÇO DE REDE

E depois foi para as propriedades da pasta para verificar se a conta de usuário associada também existe na guia de permissão. Estava faltando no meu caso e quando o adicionei, ele corrigiu o problema.

Para mais informações, verifique a captura de tela abaixo

insira a descrição da imagem aqui

Jitender Kumar
fonte
3

mesmo problema para mim também, eu estava apontando a pasta em vez de arquivo.

portanto, verifique o caminho, forneça o caminho + nome do arquivo

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

Verifique as propriedades dos seus arquivos. Se a opção somente leitura estiver marcada, desmarque-a. Esse foi meu problema pessoal com o UnauthorizedAccessException.

user3238433
fonte
2

Eu recebi esse erro e o resolvi em apenas um momento. Não sei por que todas as minhas pastas são somente leitura , cancelei a leitura e aplico-a. No entanto, ainda é somente leitura. Então eu mudei o arquivo para a pasta raiz, ele funciona - tão estranho.

MOLLMY
fonte
2

Uma exceção UnauthorizedAccessException é lançada quando o sistema operacional nega acesso devido a um erro de E / S ou de segurança.

Se você estiver tentando acessar um arquivo ou chave do registro, verifique se não é somente leitura .

reza.Nikmaram
fonte
2

Se você estiver usando o BitDefender, há uma boa chance de seus Arquivos Seguros recurso bloquear sua operação. Essa é uma forma de proteção contra Ransomware que vem com algumas de suas versões mais avançadas.

Certifique-se de conceder acesso ao seu aplicativo no BitDefender e tente novamente.

Mais alguns detalhes podem ser encontrados nesta página de suporte do BitDefender .

Vlad Schnakovszki
fonte
1

Eu tive o mesmo problema em um site recém-movido em um servidor compartilhado. Resolvido através da configuração do painel do host da web (DotNetPanel), true "permitir permissões de gravação". Portanto, se você estiver em um servidor compartilhado antes de revisar todo o código, vale a pena dar uma olhada na configuração do servidor e poupar muito tempo.

Drakell
fonte
1

Esteja ciente de que se você estiver tentando alcançar um caminho de pasta compartilhada a partir do seu código, não precisará apenas conceder as permissões adequadas para a pasta física através da guia Segurança. Você também precisa "compartilhar" a pasta com o usuário do pool de aplicativos correspondente através da guia Compartilhar

Kacho
fonte
1

Eu estava enfrentando esse erro porque

Às vezes, quando Combineo caminho com Nome do arquivo eFileName = ""

Tornar-se Path Directorynão fileé um problema como mencionado acima

então você deve procurar FileNameassim

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

Eu tive o erro exato ao excluir um arquivo. Era um serviço do Windows em execução em uma conta de serviço que não conseguia excluir um documento .pdf de uma pasta compartilhada, embora tivesse controle total da pasta.

O que funcionou para mim foi navegar para a guia Segurança da Pasta compartilhada> Avançado> Compartilhar> Adicionar.

Em seguida, adicionei a conta de serviço ao grupo de administradores, apliquei as alterações e a conta de serviço pôde executar todas as operações em todos os arquivos nessa pasta.

LuTheZy
fonte
1

Para aqueles que tentam criar um aplicativo UWP (Universal Windows), as permissões de arquivo são muito mais restritas e, em geral, são negadas por padrão. Ele também substitui as permissões de usuário do sistema. Você basicamente terá apenas acesso a arquivos em qualquer

  • Seu local de instalação
  • Sua localização AppData
  • Arquivos selecionados pelo seletor de arquivos ou pastas
  • Locais solicitados no seu manifesto do aplicativo

Você pode ler mais aqui para obter detalhes => https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions

Tezra
fonte
1

No meu caso, o problema era o Norton. Meu programa interno não possui a assinatura digital adequada e, ao tentar excluir um arquivo, deu a UnauthorizedAccessException.

insira a descrição da imagem aqui

Se você receber uma notificação, poderá lidar com isso a partir daí. No meu caso, não deu uma notificação que eu notei. Então, veja como impedir o Norton de bloquear o programa.

  1. Abra o Norton
  2. Clique na seta para baixo
  3. Histórico de cliques
  4. Localizar atividade por programa
  5. Clique em Mais opções
  6. Clique em Excluir processo
D_Bester
fonte
0

Eu também enfrentei o mesmo problema ao tentar fazer isso após a implantação no 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);

Eu concedi permissão no IIS a outro grupo, incluindo o administrador, e meu problema foi resolvido.

Manish Singh
fonte
0

Descobri que esse erro pode ocorrer no DESIGN MODE em vez de? modo de execução ... Se você estiver criando algo como criar um membro da classe que exija acesso a um arquivo .INI ou .HTM (arquivo de configuração, arquivo de ajuda), talvez NÃO queira inicializar o item na declaração, mas inicializá-lo mais tarde em FORM_Load () etc ... Quando você inicializa ... Use uma instrução IF de guarda:

    /// <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();
        }
    }

Isso impedirá que o MSVS Designer tente criar um arquivo INI ou HTM quando você estiver no modo de design.

Terry
fonte
0

Tive esse erro quando tentei renomear uma pasta muito rapidamente depois que ela foi movida ou criada.

Um simples System.Threading.Thread.Sleep(500);resolveu:

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
fonte
Acho que seria melhor se você checasse se a pasta existia antes de movê-la, em vez de dormir por meio segundo ... se o sistema operacional estiver ocupado, a movimentação anterior pode levar mais de meio segundo e você está de volta ao mesmo problema.
Paul Zahra
Este pedaço de código é muito perigoso. Ele repete o método RenameFile, independentemente da exceção lançada! Poderia causar o aplicativo falha se a causa da exceção é um problema de permissão real
Hossein Shahdoost
0

No meu caso particular, eu estava criando e excluindo repetidamente 10000 pastas. Parece-me que o problema estava no fato de que, embora o método Directory.Delete(path, true)retorne, o mecanismo do SO subjacente ainda pode estar excluindo os arquivos do disco. E quando estou começando a criar novas pastas imediatamente após a exclusão das antigas, algumas delas ainda estão bloqueadas porque ainda não foram completamente excluídas. E estou recebendo System.UnauthorizedAccessException: "Acesso ao caminho negado".

insira a descrição da imagem aqui

Usar Thread.Sleep(5000)depois Directory.Delete(path, true)resolve esse problema. Concordo absolutamente que isso não é seguro e não estou incentivando ninguém a usá-lo. Eu adoraria aqui uma abordagem melhor para resolver esse problema e melhorar minha resposta. Agora, estou apenas dando uma idéia de por que essa exceção pode acontecer.

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
fonte
0

Primeiro basta verificar o caminho se o caractere de dois pontos (:) estiver ausente ou não após a letra da unidade. Se dois pontos não estiverem faltando, você poderá verificar se a permissão de acesso / gravação é concedida para esse caminho. Eu tive o mesmo problema e estava faltando apenas os dois pontos, a permissão e tudo o mais estava bem.

C:\folderpath

vai funcionar bem mas,

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

dará acesso a erro de negação.

Vijay Dodamani
fonte
0

Eu estava tentando usar System.IO.File.OpenWrite (path)

e não funcionou porque eu estava apenas passando o caminho do OpenWrite () para um diretório, mas requer um caminho até o arquivo que você deseja gravar. Portanto, um caminho completo, incluindo o filename.extension no final, precisa ser passado para o OpenWrite para evitar UnauthorizedAccessException

SeanMC
fonte
0

Também encontrei este post como lidando com o mesmo problema. Parece que o arquivo está em uso e, portanto, não pode gravá-lo. Embora não seja capaz de descobrir, qual processo está sendo usado. Desconectou o outro usuário que estava conectado nessa caixa, não vê nenhum usuário que o esteja mantendo. Algumas dicas rápidas sobre como encontrar o mesmo.

Obrigado, Lakshay (desenvolvedor)

Lakshay Gupta
fonte
Na sua resposta, não poste uma nova pergunta, mas tente responder à pergunta do pôster original com informações úteis. Para sua própria pergunta, procure primeiro o stackoverflow para perguntas iguais ou semelhantes. Se não encontrar nenhuma, poste uma nova pergunta seguindo este guia: Como fazer uma boa pergunta
alev
0

Para resolver esse problema, sigo a abordagem de Scot Hanselman em Debugging System.UnauthorizedAccessException (geralmente seguida de: Acesso ao caminho negado) , o código com o exemplo é o seguinte:

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
fonte