2016-12-14 41 views
0

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

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

+0

你可以试试'FileIOPermission的权限=新的FileIOPermission(FileIOPermissionAccess.Read,目录); 权限.AddPathList(FileIOPermissionAccess.Read,file); permission.Demand();' –

回答

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); 

而且finaly获得(或检查)允许您可以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) 
    { 

    } 
} 

让我知道是否帮助你。如果没有,我会尝试用另一个解决方案更新我的答案。

+0

感谢您的及时回复。我现在只是有一个小问题。例如,我在桌面上有一个“.myox”文件,但该程序会捕获一个异常情况 - “访问路径C \ users \ all users \ microsoft \ windows \ systemdata被拒绝”,然后跳到C \ Windows文件夹,并且不会在用户(C \ users \ Manu \ desktop \)下找到其他文件夹下的其他子文件夹。是否还需要添加其他内容? 非常感谢您花时间回答我的问题。 – manuviswan

1

我在你的代码中注意到的一件事是你没有浏览所有的目录和子目录。对于这一点,在那里你调用GetDirectories功能,不仅送的路径,但使用枚举Alldirectories:

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