4

私は、Wireshark ファイルを再生し、pcapdot.net を使用してパケットをネットワーク カードに送信するビルド アプリケーションです。

私のアプリケーションでは、ディレクトリ ルートを取得し、過去 24 時間の新しいファイルのみを追加します。最初に、すべてのファイルをディレクトリから my に追加しList<string>、次にmy に追加しますListView。アプリケーションがすべてのファイルの再生を終了した後、リストをクリアし、ListView をクリアして、過去 24 時間のファイルを再度検索し、ListView. 私の問題は、ファイルをリストに再度追加し、ファイルを追加しようとするとListView、アプリケーションがクラッシュし、アイテム「file.pcap」を複数の場所に追加または挿入できないというエラーが発生するということです。まず、現在の場所から削除するか、複製する必要があります。

ファイルの再生が終了したら、List、ListView を消去し、再度ファイルを追加して再生します。

            lvFiles.Items.Clear();
            filesList.RemoveRange(0, filesList.Count - 1);
            addFiles();
            playFiles();

追加ファイル(); - すべてのファイルを List から ListView にアフします:

private void addFiles()
{
    BackgroundWorker backgroundWorker = new BackgroundWorker();
    backgroundWorker.WorkerReportsProgress = true;
    backgroundWorker.DoWork += new DoWorkEventHandler(
    (s3, e3) =>
    {
        filesList = SafeFileEnumerator.EnumerateFiles(pathToSearch, "*.pcap",
            SearchOption.AllDirectories).ToList();
    });

    backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
        (s3, e3) =>
        {
            if (filesList.Count != 0)
                AddFilesToListView(filesList);
        });

    backgroundWorker.RunWorkerAsync();
}

playFiles() - ListView ですべてのファイルを再生します。

private void playFiles()
{
    lockButtons();
    string filePath = string.Empty;
    BackgroundWorker backgroundWorker = new BackgroundWorker();
    backgroundWorker.WorkerReportsProgress = true;
    backgroundWorker.DoWork += new DoWorkEventHandler(
    (s3, e3) =>
    {
        for (int i = 0; i < lvFiles.Items.Count && shouldContinue; i++)
        {
            this.Invoke((MethodInvoker)delegate
            {
                lvFiles.EnsureVisible(i);
                lvFiles.Items[i].Selected = true;
                lvFiles.Select();
                filePath = lvFiles.Items[i].Tag.ToString();
                toolStripStatusLabel.Text = string.Format("Current file: {0}", lvFiles.Items[i].Text);
            });

            PcapFile pcapFile = new PcapFile();
            pcapFile.sendQueue(filePath, adapter);
            this.Invoke((MethodInvoker)delegate { lvFiles.Items[i].Selected = false; });
        }
    });

私のListViewにファイルを追加します:

private void addFileToListBox(string filePath, string duration)
{
    item = new ListViewItem(new string[] { new FileInfo(filePath).Name, duration, "Waiting" });
    item.Tag = new FileInfo(filePath).FullName;
    this.Invoke((MethodInvoker)delegate { lvFiles.Items.Add(item); });
}

おそらく「誰か」がまだファイルを保持していますか?

4

1 に答える 1

3

あなたの問題はこの行であると確信しています:

item = new ListViewItem(new string[] { new FileInfo(filePath).Name, duration, "Waiting" });

これにより、新しいオブジェクトが作成されますがitem、見た目では、意図したよりも大きなスコープ (おそらくフォーム全体) で宣言されているオブジェクトが参照されます。

オブジェクトのスコープを、ListView に追加するメソッドのスコープにする必要があります。

        private void addFileToListBox(string filePath, string duration)
        {
            ListViewItem item = new ListViewItem(new string[] { new FileInfo(filePath).Name, duration, "Waiting" });
            item.Tag = new FileInfo(filePath).FullName;
            this.Invoke((MethodInvoker)delegate { lvFiles.Items.Add(item); });
        }

より大きなスコープで変数を宣言した場合item、新しい ListViewItem を作成するたびに、最初と同じアイテムをリストビューで実際に使用しています。

を宣言する場所を示していませんがitem、間違ったスコープで宣言している行も削除する必要があります。

ListViewItem item; // <-- Delete me
于 2013-01-09T22:56:25.407 に答える