C# 对路径的访问被拒绝。

C# 对路径的访问被拒绝。,c#,path,file-attributes,C#,Path,File Attributes,小错误,时间执行删除文件的正常过程,再过一个小时执行相同的过程,我得到这个错误 这是通过IIS访问的网站文件夹的更新,然后在用户登录网站时发生此过程 你不知道会是什么 异常。消息= 对路径“W:\inetpub\wwwroot\site\Recursos\Css\font\roboto-light\u 0-webfont.ttf”的访问被拒绝 消息:对路径“W:\inetpub\wwwroot\site\Recursos\Css\font\roboto-light\u 0-webfont.ttf

小错误,时间执行删除文件的正常过程,再过一个小时执行相同的过程,我得到这个错误

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

你不知道会是什么

异常。消息=

对路径“W:\inetpub\wwwroot\site\Recursos\Css\font\roboto-light\u 0-webfont.ttf”的访问被拒绝

消息:对路径“W:\inetpub\wwwroot\site\Recursos\Css\font\roboto-light\u 0-webfont.ttf”的访问被拒绝。StackTrace:at System.IO.\u Error.WinIOError(Int32 errorCode,String maybeFullPath)at System.IO.File.SetAttributes(String path,FileAttributes FileAttributes)at ServicataAlizador.Utilitarios.Pacote.Deletarquivos(List
1 Ignorar,String[]文件)在d:\WOOBA_WORKSPACE_2010\WOOBA webdesk\Source\Development\aspwooba webdesk\servicoatalizador\Utilitarios\Pacote.cs中:servicoatalizador.Utilitarios.Pacote.DeleteDirectory的第77行(字符串target_dir,List
1 Ignorar,Boolean deletaraiz)在d:\WOOBA_WORKSPACE_2010\WOOBA webdesk\Source\Development\aspwooba webdesk\servicoatalizador\Utilitarios\Pacote.cs中:servicoatalizador.Utilitarios.Pacote.DeleteDirectory的第46行(字符串target_dir,List
1 Ignorar,Boolean deletaraiz)在d:\WOOBA_WORKSPACE_2010\WOOBA webdesk\Source\Development\aspwooba webdesk\servicoatalizador\Utilitarios\Pacote.cs中:servicoatalizador.Utilitarios.Pacote.DeleteDirectory的第37行(字符串target_dir,List
1 Ignorar,Boolean deletaraiz)在d:\WOOBA_WORKSPACE_2010\WOOBA webdesk\Source\Development\aspwooba webdesk\servicoatalizador\Utilitarios\Pacote.cs中:servicoatalizador.Utilitarios.Pacote.DeleteDirectory的第37行(字符串target_dir,List
1 Ignorar,Boolean deletaraiz)在d:\WOOBA_WORKSPACE_2010\WOOBA webdesk\Source\Development\aspwooba webdesk\servicoatalizador\Utilitarios\Pacote.cs中:servicoatalizador.Processamento.processaratalizao处的第37行在d:\WOOBA\u WORKSPACE\u 2010\WoobaWebDesk\Source\Development\aspWoobaWebDesk\servicecoatalizador\Processamento.cs中:第227行来源:mscorlib

代码:

公共静态void DeleteDirectory(字符串target_dir,List Ignorar=null,bool deletaraiz=true)
{
string[]files=Directory.GetFiles(target\u dir);
字符串[]dirs=Directory.GetDirectories(目标目录);
deletarquivos(Ignorar,文件);
foreach(dirs中的字符串dir)
{
删除目录(dir);
}
如果(代表团)
{
int contador=0;
while(Directory.GetFiles(target_dir).Any())//阻止目录不为空
{
系统线程线程睡眠(200);
deletarquivos(Ignorar,Directory.GetFiles(target_dir));
contador++;
如果(contador>=3)
抛出新的例外(“Não possível deletar os arquivos,diretório:”+target_dir);
}
Directory.Delete(target_dir,false);
}
}
私有静态void deletarquivos(列表Ignorar,字符串[]文件)
{
foreach(文件中的字符串文件)
{
FileInfo=newfileinfo(文件);
if(Ignorar!=null)
{
if(Ignorar.Any(o=>o.Equals(Info.Name,StringComparison.OrdinalIgnoreCase)))
继续;
}
如果(仅限信息)
Info.IsReadOnly=false;
var attr=File.GetAttributes(文件);
if((attr&FileAttributes.ReadOnly)=FileAttributes.ReadOnly)
{
SetAttributes(文件,attr^FileAttributes.ReadOnly);
}
File.SetAttributes(File,FileAttributes.Normal);/…此处出错
文件。删除(文件);
}
}

出现这种异常的原因有很多,但如果不了解更多情况,就不可能说出来。可能是,如果该文件是通过IIS上载的,那么IIS可能仍然有一个句柄。您确定已处理任何流或文件访问吗

无论哪种方式,我都会将删除文件的尝试包装在try/catch块中,并记录所有失败。这样,您的应用程序就不会崩溃,并且您可以很容易地看到哪些文件导致了问题。可能是下一次尝试删除时,它会起作用。取决于文件保存的时间

正如我所说,没有更多的背景,我们不能说,但是在这种情况下,try/catch是你应该经常做的事情,所以我想补充一下,看看你是怎么做的

希望有帮助

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