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

問題は、一部のフォルダにアクセスできないため、例外が発生することです。

たとえば、プログラムファイルにアクセスできません。

そのための回避策はありますか?

編集: これがコードです。ご覧のとおり、例外が発生した場合でも続行できるようにコードを構成しました。それが発生すると、パス「C:\ArquivosdeProgramas」へのアクセスが拒否されましたというメッセージのみが表示されます。ファイルやフォルダはありません

この動作を回避して、許可されているものを画面に印刷するにはどうすればよいですか?

ありがとう

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

2 に答える 2

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
于 2012-11-27T16:05:36.337 に答える
0

はい、残念ながら、これは の制限ですGetDirectories

チェックアウト:システムが C:\users\ にアクセスできないため、実行中の Windows サービス

上記の例では、許可レベルに関係なく例外が発生しますが、同じ原則が適用されます。例外が発生すると、関数全体が失敗します。

その投稿のリンクされた記事で提案されているように PInvoke を使用すると、完全に失敗するのではなく、例外を無視して少なくとも続行できます。

于 2012-11-27T16:05:00.697 に答える