请帮我更正此代码,以便检查可移动驱动器的任何子文件夹中是否有特定文件。
private void timer2_Tick(object sender, EventArgs e)
{
DriveInfo[] ListDrives = DriveInfo.GetDrives();
foreach (DriveInfo Drive in ListDrives)
{
if (Drive.DriveType == DriveType.Removable)
{
string[] dr = Directory.GetDirectories(@"F:");
for (int i = 0; i <= dr.GetUpperBound(0); i++)
{
parisa(dr[i]);
}
}
}
}
private void parisa(string address)
{
string[] files = Directory.GetFiles(address);
for (int i = 0; i <= files.GetUpperBound(0); i++)
{
if(files[i].IndexOf("autorun.inf") != -1)
{
MessageBox.Show("The USB is Viral");
}
else{
MessageBox.Show("The USB is Safe");
}
}
string[] z = Directory.GetDirectories(address);
for (int i = 0; i <= z.GetUpperBound(0); i++)
{
parisa(z[i]);
}
}
}
此代码无法正常运行。我创建了一个“autorun.inf”子文件夹,但它显示它是安全的!
答案 0 :(得分:2)
您说该程序未检测到名为autorun.inf
的文件夹。那是因为你不区分文件夹的名称。您只能区分文件名。在parisa
方法的开头添加对目录名称的检查。
对于您的测试,您还应该使用StringComparison.OrdinalIgnoreCase
,因为Windows上的文件名不区分大小写。
这样的事情似乎就是你想要的:
private void parisa(string directory)
{
if(directory.IndexOf("autorun.inf", StringComparison.OrdinalIgnoreCase) != -1)
{
MessageBox.Show("The USB is Viral");
}
....
}
显然,目录名的测试是对文件名测试的补充。
你的for
循环有点不寻常。迭代数组通常使用foreach
循环完成。
foreach (string filename in Directory.GetFiles(directory))
{
....
}
除此之外,使用消息框提供反馈是不切实际的,并且执行得很糟糕。您为每个遇到的对象显示一个消息框。只要找到不包含魔术文件名的文件,就会显示一个消息框。然后再次为下一个文件。等等。
您确实需要更改递归函数,以便在找到魔术文件名时返回布尔值。并在递归之外显示消息框。像这样:
private bool find(string directory, string target)
{
if (directory.IndexOf(target, StringComparison.OrdinalIgnoreCase) != -1)
return true;
foreach (string filename in Directory.GetFiles(directory))
if (filename.IndexOf(target, StringComparison.OrdinalIgnoreCase) != -1)
return true;
foreach (string subdir in Directory.GetDirectories(directory))
if (find(subdir, target))
return true;
return false;
}
这里似乎相当缺乏清晰度。在评论中,显然您要做的就是搜索名为autorun.inf
的文件。这是微不足道的:
Directory.GetFiles(@"F:\", "autorun.inf", SearchOption.AllDirectories)