尝试为我的公司编写一个小型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
答案 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))