【问题标题】:Checking folder/files permissions when retrieving directories with GetDirectories()使用 GetDirectories() 检索目录时检查文件夹/文件权限
【发布时间】:2012-11-15 07:14:17
【问题描述】:
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;
}  

【问题讨论】:

  • 找到目录后,您想在目录上做什么?
  • Eai Xará, brasileiro também né? estava com o mesmo problema,fiz um try catch sendo q no catch eu mostrava na lista um item escrito "Acesso Negado",funcionou aqui。 obrigado。

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


【解决方案1】:

一般来说没有任何解决方法。

您不能更改(在大多数情况下您根本不能)主机 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

【讨论】:

  • 如果用户无权访问文件,我只想跳过检查...如果没有权限,则不要打印文件夹或文件...
  • 啊,在这一点上,我相信,在循环内处理适当的异常是最好的选择。像普通的 IO 操作管理一样,用适当的或预期的异常处理来管理它
  • 问题是.. 如果 getDirectory 或 getFile 在未经许可的情况下到达文件,则整个方法将失败。 ;O( 即使处理代码,对于那个特定的逻辑驱动程序,你会丢失所有内容,代码会转到下一个逻辑驱动程序
  • @user1827417:如果一个文件的读取权限失败,但您想继续迭代同一目录中的其他文件,请将您的异常处理深入到你读的是单个文件。
  • 我已经用代码更新了帖子。我真的不明白你的意思是更深入地移动异常。拜托,你能帮我吗?
【解决方案2】:

是的,很遗憾,这是GetDirectories 的限制。

查看:Windows service running as system cannot access C:\users\

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

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

【讨论】:

  • 它确实有效,但该方法仍然失败,所以对于那个逻辑驱动程序我什么也得不到。系统不会崩溃,我可以在下一个逻辑驱动程序中搜索,但不能在出现异常的驱动程序中搜索
猜你喜欢
  • 2010-10-28
  • 1970-01-01
  • 2011-10-28
  • 2011-08-20
  • 2011-09-19
  • 2015-10-16
  • 2015-05-27
  • 2010-09-06
  • 1970-01-01
相关资源
最近更新 更多