0

ファイルとフォルダーのコピーを目的とした監査ツールを作成したいと考えています。

ツリービューを使用して再帰法を使用してファイルとフォルダーをロードしますが、ツリービューでチェックされたファイルとフォルダーがリストビューでロードされると、膨大な時間がかかります (2GB で 21 分)。それは問題です。

計算を高速化するために、最短時間でツリービューからリストビューにファイルとフォルダーをロードする方法は?

これが私のコードです:

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

}
4

1 に答える 1

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();
    }
}
于 2013-03-11T05:41:21.967 に答える