【问题标题】:C# Delete all files in a listboxC#删除列表框中的所有文件
【发布时间】:2017-03-26 09:12:12
【问题描述】:

我将一些文件添加到按钮上的列表框中:

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 循环来遍历这些项目,但我不确定最好的方法是什么。

【问题讨论】:

  • 您不应该简单地捕获异常而不正确处理它们。在这里你会得到一个OutOfBoundsException,因为你正在从你正在迭代的集合中删除元素
  • 目录中有多少个文件?根据逻辑,它将删除目录中的一半文件,因为 listview1.Item.Remove 会将 items.count 减少 1。因此最终迭代次数将减少到 items.count/2。
  • @ChetanRanpariya 文件将始终更改编号。 Flat Eric,谢谢,我只是在输入一个快速测试,但我会实现正确的异常(IndexOutOfRangeException)。

标签: c# winforms listbox


【解决方案1】:

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

【讨论】:

  • 感谢您的快速答复!
【解决方案2】:

当您从使用 for..next 语句迭代的数组中删除一项时,您应该考虑每次删除一个元素时,数组计数会减少一个元素,并且数组中的每个元素都会移动较低的指数。因此,当您删除索引 0 处的元素时,索引 1 处的前一个元素会移动位置 0,但您已经迭代索引 0,因此您结束跳过该元素并尝试删除索引处的元素2 在删除索引 0 处的项目之前。

解决方案很简单。逆序循环(从最高元素到最低元素)

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

【讨论】:

    【解决方案3】:

    将列表框的内容复制到一个字符串数组中,以防止在循环中从列表框中删除项目时出错。

    // 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)
    {
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      相关资源
      最近更新 更多