在计算机

时间:2016-12-14 07:48:49

标签: c# windows-applications

尝试为我的公司编写一个小型Windows应用程序。我现在卡住的部分是试图在计算机中搜索“.myox”文件(或者说任何文件类型)。粘贴下面是我编写的代码。我是一名尝试开始编码的业余程序员。目前使用下面的代码的问题是它跳过计算机上的几乎所有位置,但是“访问被拒绝”的例外情况。我以管理员身份运行VS,我也是计算机管理员。不知道我错过了什么,但如果有人能指出我正确的方向,那将是惊人的。

private void FindAllFiles()
{
int drvCount;
int drvSearchCount = 0;
DriveInfo[] allDrives = DriveInfo.GetDrives();
drvCount = allDrives.Count();

foreach (DriveInfo dr in allDrives)
{
  lbAllFiles.Items.Clear();
  drvSearchCount++;

  //removable drives
  if (!dr.IsReady)
  break;

  foreach (string dir in Directory.GetDirectories(dr.ToString()))
  {
    try
    {
      foreach (string files in Directory.GetFiles(dir, "*.myox"))
      {
        lbAllFiles.Items.Add(files);
      }

    }
    catch (Exception Error)
    {

    }
 }

if (drvSearchCount == drvCount)
break;
}

MessageBox.Show("Done searching your computer");
}

先谢谢。 -Manu

2 个答案:

答案 0 :(得分:1)

我看到几个“潜在”问题,并将在下面列出。

首先,您在主( UI )线程上执行此操作,这将阻止整个应用程序,不会给您任何关于当前状态的反馈。您可以使用Thread来解决此问题。此操作的结果将产生另一个访问lbAllFiles的问题,因为(我认为)它是UI的一部分。您可以轻松解决此问题,使List<string>可以在FindAllFiles操作期间填充,然后分配到lbAllFiles.Items

第二个问题是:

foreach (string files in Directory.GetFiles(dir, "*.myox"))
{
    lbAllFiles.Items.Add(files);
}

Directory.GetFiles(...)只会返回与您的pattern参数匹配的文件,因此您只需执行以下操作:

var files = Directory.GetFiles(dir, "*.myox");
if ( files != null && files.Length > 0 )
    lblAllFiles.Items.AddRange(files);

最后获得(或检查)权限,您可以Demand()权限发布在评论中:

  foreach (string dir in Directory.GetDirectories(dr.ToString()))
  {
    FileIOPermission permission = new FileIOPermission(FileIOPermissionAccess.Read, dir);
    try
    {
        permission.Demand();
        var files = Directory.GetFiles(dir, "*.myox");
        if ( files != null && files.Length > 0 )
            lblAllFiles.Items.AddRange(files);
    }
    catch (Exception Error)
    {

    }
 }

如果有帮助,请告诉我。如果没有,我会尝试用另一种解决方案更新我的答案。

答案 1 :(得分:1)

我在您的代码中注意到的一件事是,您没有浏览所有目录和子目录。为此,在调用GetDirectories函数的地方,不仅要发送路径,还要使用枚举器Alldirectories:

foreach (string dir in Directory.GetDirectories(dr.ToString(),System.IO.SearchOption.AllDirectories))