繁体   English   中英

如何通过“拒绝访问路径'F:/系统文件卷'”异常?

[英]How to by pass the “Access to path 'F:/System File Volume' is denied” exception?

我有一个应用程序,该应用程序读取已建立的程序集目录中的所有文件和子文件夹,并使用datagridview显示它。 但是,当我尝试在网络驱动器中运行该应用程序以尝试扫描该驱动器中的文件时,它发出了“拒绝访问路径'F:/ System File Volume'”的异常,然后该应用程序将停止运行。 关于如何通过系统文件卷并仍然显示那些可以访问的文件的任何想法。 如果需要,这是我的代码:

        private void Form1_Load(object sender, EventArgs e)
    {

        count = 0;
        timer = new Timer();
        timer.Interval = 1000;
        timer.Tick += new EventHandler(timer1_Tick);
        timer.Start();
        //FileIOPermission permit;

        try
        {   
            s1 = Directory.GetFiles(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "*.*", SearchOption.AllDirectories);
            //permit = new FileIOPermission(FileIOPermissionAccess.AllAccess, s1);
            //permit.AddPathList(FileIOPermissionAccess.AllAccess, s1);
            for (int i = 0; i <= s1.Length - 1; i++)
            {
                if (i == 0)
                {
                    dt.Columns.Add("File_Name");
                    dt.Columns.Add("File_Type");
                    dt.Columns.Add("File_Size");
                    dt.Columns.Add("Create_Date");
                }


                FileInfo info = new FileInfo(s1[i]);
                FileSystemInfo sysInfo = new FileInfo(s1[i]);
                dr = dt.NewRow();

                dr["File_Name"] = sysInfo.Name;
                dr["File_Type"] = sysInfo.Extension;
                dr["File_Size"] = (info.Length / 1024).ToString();
                dr["Create_Date"] = sysInfo.CreationTime.Date.ToString("dd/MM/yyyy");
                dt.Rows.Add(dr);


                if ((info.Length / 1024) > 1500000)
                {
                    MessageBox.Show("" + sysInfo.Name + " had reach its size limit.");
                }
            }

            if (dt.Rows.Count > 0)
            {
                dataGridView1.DataSource = dt;
            }
        }

        catch (UnauthorizedAccessException ex)
        {
            MessageBox.Show("Error : " + ex.Message);
            throw;
        }

    }

    private bool IsIgnorable(string dir)
    {
        if (dir.EndsWith(":System Volume Information")) return true;
        if (dir.Contains(":$RECYCLE.BIN")) return true;
        return false;
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
            count++;
            if (count == 60)
            {
                count = 0;
                timer.Stop();
                Application.Restart();
            }
    }

    public string secondsToTime(int seconds)
    {
         int minutes = 0;
         int hours = 0;

         while (seconds >= 60)
         {
            minutes += 1;
            seconds -= 60;
         }
         while (minutes >= 60)
         {
            hours += 1;
            minutes -= 60;
         }

         string strHours = hours.ToString();
         string strMinutes = minutes.ToString();
         string strSeconds = seconds.ToString();

         if (strHours.Length < 2)
             strHours = "0" + strHours;
         if (strMinutes.Length < 2)
             strMinutes = "0" + strMinutes;
         if (strSeconds.Length < 2)
             strSeconds = "0" + strSeconds;
         return strHours + ":" + strMinutes + ":" + strSeconds;
     }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        BindingSource bind = new BindingSource();
        bind.DataSource = dt;
        bind.Filter = string.Format("File_Name like '%{0}%'", textBox1.Text.Trim());
    }

您将必须在for循环内创建一个try / catch块,然后单独处理每个文件的错误,然后再继续循环。

我建议使用此功能,这是一些未经测试的“空中代码”,可能是语法错误,但我认为您可以理解:

bool GetFileInformation(File f, out string name)
{
    name=null;
    try
    {
       FileInfo info = new FileInfo(f);
       FileSystemInfo sysInfo = new FileSystemInfo(f);
       name=sysInfo.Name;
    }
    catch(Exception ex)
    {
        return false;
    }
    return true;
}

现在,您可以轻松地围绕此构建循环:

 for (int i = 0; i <= s1.Length - 1; i++)
 {
     if (GetFileInformation(s1[i], out name)
     {
        dr = dt.NewRow();
        dr["File_Name"] = name;
        // ....

     }
  } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM