我想制作一个旨在复制文件和文件夹的审核工具。
我使用treeview使用递归方法加载文件和文件夹,但是当treeview检查文件和文件夹加载在listview中需要很长时间(2GB时为21分钟)。这是一个问题。
如何在最短的时间内将文件和文件夹从treeview加载到listview以加快计算速度?
这是我的代码:
private void btnAddToListViewCheckedItem_Click(object sender, EventArgs e)
{
foreach (TreeNode tn in tvLoadTreeviewFromListView.Nodes)
{
AddToListView(tn);
}
}
private void AddToListView(TreeNode tn)
{
{
FileInfo file = new FileInfo(tn.Text);
string[] suffix = { "B", "KB", "MB", "GB", "TB" };
if (file.Exists)
{
int s = 0;
long size = file.Length;
while (size >= 1024)
{
NO_OF_FILES += 1;
s++;
size /= 1024;
}
String countFileSize = string.Format("{0}{1}", size, suffix[s]);
ListViewItem item = lvLoadSelectedFileAndFolder.Items.Add(file.Name);
item.ImageIndex= sysIcons.GetIconIndex(tn.Text);
item.SubItems.Add(tn.Text);
item.SubItems.Add(countFileSize);
}
foreach (TreeNode tnx in tn.Nodes)
{
for (int i = 0; i < lvLoadSelectedFileAndFolder.Items.Count; i++)
{
int ii = 1;
if (tnx.Text == lvLoadSelectedFileAndFolder.Items[i].SubItems[ii].Text)
{
return;
}
}
if (tnx.Checked)
{
AddToListView(tnx);
}
}
}
catch (Exception ){}
}
答案 0 :(得分:0)
您的suffix
数组基本上是一个常量,但每次AddToListView
处理存在的文件名时,都会在堆上重新分配。此外,在加载列表视图时暂停UI更新。试试这个......
const string[] suffix = { "B", "KB", "MB", "GB", "TB" };
private void btnAddToListViewCheckedItem_Click(object sender, EventArgs e)
{
try
{
lvLoadSelectedFileAndFolder.BeginUpdate();
foreach (TreeNode tn in tvLoadTreeviewFromListView.Nodes)
{
AddToListView(tn);
}
}
finally
{
lvLoadSelectedFileAndFolder.EndUpdate();
}
}