我将一些文件添加到按钮上的列表框中:
if (Directory.Exists(DirString))
{
DirectoryInfo dirETC = new DirectoryInfo(DirString);
FileInfo[] Files = dirETC.GetFiles("*.txt");
foreach (FileInfo file in Files)
{
listBox1.Items.Add(file.FullName);
}
如果用户点击删除按钮,我想删除列表框中的所有文件,如下所示:
try
{
listBox1.BeginUpdate();
for (int i = 0; i < listBox1.Items.Count; i++)
{
string filename = listBox1.Items[i].ToString();
if (File.Exists(filename))
{
File.Delete(filename);
listBox1.Items.Remove(filename);
}
}
listBox1.EndUpdate();
}
catch (Exception)
{
return;
}
以上代码有效,但每次点击全部删除按钮时,它只删除一个文件。我想我需要在这里添加一些foreach循环来迭代这些项目,但我不确定最好的方法是什么。
答案 0 :(得分:3)
Foreach
语句不允许您修改正在迭代的集合,而for
则会。您只需要小心索引:在删除第一个项目(索引= 0)后的解决方案中,下一个项目成为第一项。请尝试这种方法:
listBox1.BeginUpdate();
for (int i = listBox1.Items.Count - 1; i >=0; i--)
{
string filename = listBox1.Items[i].ToString();
if (File.Exists(filename))
{
try
{
File.Delete(filename);
listBox1.Items.Remove(filename);
}
catch (Exception)
{
}
}
}
listBox1.EndUpdate();
答案 1 :(得分:2)
当您从使用for..next语句迭代的数组中删除项时,您应该考虑每次删除元素时,一个元素的数组计数减少,并且数组中的每个元素都会移位较低的指数。因此,当您删除索引0处的元素时,位于索引1的前一个元素在位置0处移位,但您已经遍历索引零,因此您跳过该元素并尝试删除索引处的元素在删除索引0处的项目之前2。
解决方案很简单。以相反的顺序循环(从最高元素到最低元素)
for (int i = listBox1.Items.Count-1; i >= 0 ; i--)
{
string filename = listBox1.Items[i].ToString();
if (File.Exists(filename))
{
File.Delete(filename);
listBox1.Items.Remove(filename);
}
}
答案 2 :(得分:1)
将列表框的内容复制到字符串数组中,以防止在循环中从列表框中删除项目时出错。
// Copy the contents of the listbox into a string array
string[] filenameList = listBox1.Items.OfType<string>().ToArray();
try
{
for (int i = 0; i < filenameList.Length; i++)
{
string filename = filenameList[i];
if (File.Exists(filename))
{
File.Delete(filename);
listBox1.Items.Remove(filename);
}
}
}
catch (Exception)
{
}