首页 文章

如何通过“访问路径'F:/System File Volume'被拒绝”例外?

提问于
浏览
1

我有一个应用程序,它读取构建的程序集目录中的所有文件和子文件夹,并使用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());
    }

1 回答

  • 0

    您必须在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;
            // ....
    
         }
      }
    

相关问题