使用GetDirectories()检索目录时检查文件夹/文件权限

时间:2012-11-27 15:58:41

标签: c# asp.net asp.net-mvc asp.net-mvc-4 file-permissions

DirectoryInfo[] directories = 
        di.GetDirectories("*.*", SearchOption.AllDirectories);

问题是我无法访问某些文件夹,因此我得到了一个例外。

程序文件,例如我无法访问。

有没有解决办法?

修改 这是代码。如您所见,我已配置代码,以便在发生异常时继续。当它发生时我只得到消息访问路径'C:\ Arquivos de Programas'被拒绝。没有文件或文件夹

如何避免此行为并在屏幕上打印我允许的内容?

由于

 try
{
    //Resgata todos os drivers Lógicos do Sistema
    DriveInfo[] allDrives = DriveInfo.GetDrives();

    //Cria uma lista não ordenada para os DRIVERS
    Response.Write("<ul class=\"jqueryFileTree\" style=\"display: none;\">\n");

    //Itera sobre cada driver no array
    foreach (DriveInfo drive in allDrives)
    {
        if (drive.IsReady == true)
        {
            try //GetDirectories
            {
                //Para cada driver cria um LI A 
                Response.Write("\t<li class=\"drive collapsed\"><a href=\"#\" rel=\"" + drive.ToString() + "\">" + drive.ToString() + "</a>\n");

                System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(drive.ToString());
                DirectoryInfo[] directories = di.GetDirectories("*.*", SearchOption.AllDirectories);


                Response.Write("<ul>");
                //Itera sobre os subdiretórios de cada driver
                foreach (System.IO.DirectoryInfo di_child in directories)
                {

                    Response.Write("\t<li class=\"directory collapsed\"><a href=\"#\" rel=\"" + drive + di_child.Name + "/\">" + di_child.Name + "</a>\n");
                    Response.Write("<ul>");
                    //Itera sobre todos os arquivos do diretório


                    foreach (System.IO.FileInfo fi in di.GetFiles())
                    {
                        string ext = "";
                        if (fi.Extension.Length > 1)
                        {
                            ext = fi.Extension.Substring(1).ToLower();
                        }

                        Response.Write("\t<li class=\"file ext_" + ext + "\"><a href=\"#\" rel=\"" + drive + fi.Name + "\">" + fi.Name + "</a></li>\n");
                    }// Arquivos 
                    Response.Write("</ul></li>");
                }// subdiretorio 
                Response.Write("</ul></li>");
            }
            catch (UnauthorizedAccessException e)
            {
                Response.Write(e.Message);
                continue;
            }
            catch (System.IO.DirectoryNotFoundException e)
            {
                Response.Write(e.Message);
                continue;
            }
            catch (Exception e)
            {

                Response.Write(e.Message);
                continue;
            }

        }//isReady

    }///drive
    Response.Write("</ul>");

}
catch (Exception)
{

    throw;
}  

2 个答案:

答案 0 :(得分:2)

一般来说,没有任何工作环节。

您不允许在主机PC上更改(在大多数情况下,您根本无法)权限映射。因此,唯一认为你能做到的,只是捕获一个例外并向用户报告这个事实,可能是,某些建议,如何解决这个问题。

可能某些黑客,技巧或其他什么,但在我看来,这不是好设计。 除非你没有编写病毒,否则不要破解系统。

修改

如果您担心如果单个文件在加载时失败,您的目录解析失败,您可以执行以下操作:

foreach (System.IO.FileInfo fi in di.GetFiles())
{
     try{
           string ext = "";
           if (fi.Extension.Length > 1)
           {
                 ext = fi.Extension.Substring(1).ToLower();
           }

            Response.Write("\t<li class=\"file ext_" + ext + "\"><a href=\"#\" rel=\"" + drive + fi.Name + "\">" + fi.Name + "</a></li>\n");
        }
        catch(..) {
          //handle here exception raised during SINGLE file parsing
        }
}// Arquiv

答案 1 :(得分:0)

是的,不幸的是,这是GetDirectories的限制。

退房:Windows service running as system cannot access C:\users\

在上面的示例中,无论权限级别如何都会发生execptions,但同样的原则适用。当您遇到异常时,整个函数都会失败。

按照该帖子中链接文章的建议使用PInvoke,您至少可以继续,忽略异常而不是彻底失败。