2013-01-09 30 views
4

我構建的應用程序使用pcapdot.net播放Wireshark文件並將數據包發送到網卡。無法在多個位置添加或插入項目MyFile

在我的應用程序中,我得到目錄根目錄,並且只添加最近24小時內的新文件。 首先,我將目錄中的所有文件添加到List<string>,然後添加到我的ListView。 現在我的應用程序完成播放我想清除我的列表的所有文件後,清除我的ListView,然後再次搜索最近24小時內的文件,並將其添加到我的ListView。 我的問題是在這個地方,再次將文件添加到我的列表並嘗試將文件添加到我的ListView應用程序崩潰,錯誤無法在多個位置添加或插入項目'file.pcap'。您必須先將其從當前位置移除或克隆。

後完成打我的文件,我是乾淨的名單,ListView和重新添加文件和播放:

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

addFiles(); - AFF上所有的文件列表我的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); }); 
} 

也許「某人」仍然擁有該文件?

+0

顯示一些代碼。特別是在您添加到ListView並清除ListView的地方。 –

+0

看到我的更新.. – user1269592

+0

你在addFileToListBox方法中聲明名爲'item'的ListViewItem? – Mitch

回答

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 
相關問題