拒绝访问该路径。

时间:2016-05-10 14:29:13

标签: c# path denied access file-attributes

琐碎的错误,时间执行删除文件的正常过程,另一个小时执行相同的过程我收到此错误。

这是通过IIS访问的网站文件夹的更新,然后在人们登录网站时发生此过程。

你不知道会是什么?

Exception.Message =

  

拒绝访问路径'W:\ inetpub \ wwwroot \ site \ Recursos \ Css \ Fonts \ roboto-light_0-webfont.ttf'。

消息:拒绝访问路径'W:\ inetpub \ wwwroot \ site \ Recursos \ Css \ Fonts \ roboto-light_0-webfont.ttf'。 StackTrace:在System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)处于System.IO.File.SetAttributes(String path,FileAttributes fileAttributes),位于ServicoAtualizador.Utilitarios.Pacote.DeletarArquivos(List 1 Ignorar, String[] files) in d:\WOOBA_WORKSPACE_2010\WoobaWebDesk\Source\Development\aspWoobaWebDesk\ServicoAtualizador\Utilitarios\Pacote.cs:line 77 at ServicoAtualizador.Utilitarios.Pacote.DeleteDirectory(String target_dir, List 1 Ignorar,布尔deletarRaiz)在d:\ WOOBA_WORKSPACE_2010 \ WoobaWebDesk \ Source \ Development \ aspWoobaWebDesk \ ServicoAtualizador \ Utilitarios \ Pacote.cs:第46行ServicoAtualizador.Utilitarios.Pacote.DeleteDirectory(String target_dir,List 1 Ignorar, Boolean deletarRaiz) in d:\WOOBA_WORKSPACE_2010\WoobaWebDesk\Source\Development\aspWoobaWebDesk\ServicoAtualizador\Utilitarios\Pacote.cs:line 37 at ServicoAtualizador.Utilitarios.Pacote.DeleteDirectory(String target_dir, List 1 Ignorar,Boolean deletarRaiz )在d:\ WOOBA_WORKSPACE_2010 \ WoobaWebDesk \ Source \ Development \ aspWoobaWebDesk \ ServicoAtualizador \ Utilitarios \ Pacote.cs:第37行在ServicoAtualizador.Utilitarios.Pacote.DeleteDirectory(String target_dir,List 1 Ignorar, Boolean deletarRaiz) in d:\WOOBA_WORKSPACE_2010\WoobaWebDesk\Source\Development\aspWoobaWebDesk\ServicoAtualizador\Utilitarios\Pacote.cs:line 37 at ServicoAtualizador.Processamento.ProcessarAtualizacao(String Aplicacao, DirectoryItem arquivo, AtualizacaoItemProduto itemProduto, AtualizacaoItem item, List 1 colecao)中d:\ WOOBA_WORKSPACE_2010 \ WoobaWebDesk \ Source \ Development \ aspWoobaWebDesk \ ServicoAtualizador \ Processamento.cs:第227行资料来源:mscorlib

CODE:

public static void DeleteDirectory(string target_dir, List<string> Ignorar = null, bool deletarRaiz = true)
    {
        string[] files = Directory.GetFiles(target_dir);
        string[] dirs = Directory.GetDirectories(target_dir);

        DeletarArquivos(Ignorar, files);

        foreach (string dir in dirs)
        {
            DeleteDirectory(dir);
        }

        if (deletarRaiz)
        {
            int contador = 0;
            while (Directory.GetFiles(target_dir).Any()) // prevent directory is not empty
            {
                System.Threading.Thread.Sleep(200);
                DeletarArquivos(Ignorar, Directory.GetFiles(target_dir));
                contador++;
                if (contador >= 3)
                    throw new ArgumentException("Não possível deletar os arquivos, diretório:" + target_dir);
            }

            Directory.Delete(target_dir, false);
        }
    }

    private static void DeletarArquivos(List<string> Ignorar, string[] files)
    {
        foreach (string file in files)
        {
            FileInfo Info = new FileInfo(file);

            if (Ignorar != null)
            {
                if (Ignorar.Any(o => o.Equals(Info.Name, StringComparison.OrdinalIgnoreCase)))
                    continue;
            }

            if (Info.IsReadOnly)
                Info.IsReadOnly = false;

            var attr = File.GetAttributes(file);

            if ((attr & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
            {
                File.SetAttributes(file, attr ^ FileAttributes.ReadOnly);
            }
            File.SetAttributes(file, FileAttributes.Normal); //...error here
            File.Delete(file);
        }
    }

1 个答案:

答案 0 :(得分:0)

为什么你会得到这个例外有很多原因,但是如果不知道发生了什么,就不可能说出来。可能是因为如果文件是通过IIS上传的,那么IIS可能仍然有一个句柄。您确定已丢弃任何流或文件访问权限吗?

无论哪种方式,我都会尝试删除try / catch块中的文件,并记录任何失败。这样,您的应用程序不会崩溃,您可以轻松地看到哪些文件导致了问题。可能是下次尝试删除时,它会起作用。取决于文件保存的时间。

正如我所说的,没有更多的背景,我们不能说,但是在这样的情况下你应该总是这样做,所以我会添加它,看看你是如何进行的。

希望有所帮助。