[英]C# Delete all files in a listbox
我將一些文件添加到按鈕上的列表框:
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循環來遍歷項目,但是我不確定什么是最好的方法。
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();
當您使用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);
}
}
將列表框的內容復制到字符串數組中,以防止在循環中從列表框中刪除項目時出錯。
// 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)
{
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.