2016-03-21 4 views
1

Ich kann keine Antwort auf diese Art von Problem irgendwo im Internet finden, so dass ich dachte, ich könnte mich auch fragen. Ich muss in der Lage sein, eine Taste zu drücken, die dann eine Funktion ausführt, die das ausgewählte Dateiverzeichnis und alle Unterordner danach durchsucht, um zu sehen, ob dieselbe Datei zweimal vorhanden ist. Ich werde im Folgenden alle notwendigen Code setzen:Wie kann ich die Duplikate in einer Listbox mit einem Knopf anzeigen C#

public partial class fileForm : Form 
{ 
     private string _filelistlocation; 
     private string _fileDest; 
     private string _fileSource; 

     public fileForm() 
     { 
      InitializeComponent(); 
     } 


public void fileForm_Load(object sender, System.EventArgs e) 
{ 
      _filelistlocation = textBox1.Text; 
      _fileDest = labelDestRoot.Text; 
      _fileSource = labelSourceRoot.Text; 
} 

private void button1_Click(object sender, System.EventArgs e) 
{ 
      checkedListBox1.Items.Clear(); 
      listBox2.Items.Clear(); 
      ReadFromList(); 
} 

private void GetDuplicates() 
{ 
      DirectoryInfo directoryToCheck = new DirectoryInfo(@"C:\temp\Location Source");` 

      FileInfo[] files = directoryToCheck.GetFiles("*.*", SearchOption.AllDirectories); 
      var duplicates = files.GroupBy(x => x.Name) 
            .Where(group => group.Count() > 1) 
            .Select(group => group.Key);//display duplicates 
      if (duplicates.Count() > 0) 
      { 
       MessageBox.Show("No Dupes"); 
       FileStream s2 = new FileStream(_filelistlocation, FileMode.Open, FileAccess.Read, FileShare.Read); 
      } 
      else 
       listBox1.Items.Add(duplicates);` 
     } 

private void button5_Click_1(object sender, EventArgs e) 
{ 
      GetDuplicates(); 
} 

EDIT: `private void GetDuplicates() { Directory directoryToCheck = new Directory (@ "C: \ temp \ Location Source");

 FileInfo[] files = directoryToCheck.GetFiles("*.*", SearchOption.AllDirectories); 
     var duplicates = files.GroupBy(x => x.Name) 
           .Where(group => group.Count() > 1) 
           .Select(group => group.Key);//display duplicates 
     if (!duplicates.Any()) 
     { 
      listBox1.Items.Add(duplicates); 

      FileStream s2 = new FileStream(_filelistlocation, FileMode.Open, FileAccess.Read, FileShare.Read); 



     } 
     else 
      MessageBox.Show("No Dupes"); 
    }` 

so?

EDIT 2:

private void GetDuplicates() 
    { 
     DirectoryInfo directoryToCheck = new DirectoryInfo(@"C:\temp\Location Source"); 

     FileInfo[] files = directoryToCheck.GetFiles("*.*", SearchOption.AllDirectories); 
     var duplicates = files.GroupBy(x => x.Name) 
           .Where(group => group.Count() > 1) 
           .Select(group => group.Key);//display duplicates 
     if (!duplicates.Any()) 
     { 
      listBox1.Items.Add(duplicates.ToArray()); 

      FileStream s2 = new FileStream(_filelistlocation, FileMode.Open, FileAccess.Read, FileShare.Read); 



     } 
     else 
      MessageBox.Show("No Dupes"); 
    } 

Wenn jemand das wäre schön helfen könnte. Vielen Dank!

+1

Was ist das Problem, das Sie mit dem entsandten Code konfrontiert sind? –

+0

Wenn ich auf die Schaltfläche klicke, erscheint die Meldung "No Dupes", während das, was ich trotzig teste, Duplikate hat. –

+2

Da Sie die Nachricht bei if Block anzeigen, sollte es bei else Block sein. –

Antwort

1

Etwas wie folgt aus:

// Fluent: given directory name obtain duplicates with no temporarys 
    var duplicates = Directory 
    .EnumerateFiles(@"C:\temp\Location Source", "*.*", SearchOption.AllDirectories) 
    .GroupBy(file => Path.GetFileName(file)) 
    .Where(chunk => chunk.Count() > 1) 
    .Select(chunk => chunk.Key); 

    // Straightforward: are there ANY duplicates? 
    if (duplicates.Any()) { 
    // Please note "AddRange" (you have many items to add) 
    listBox1.Items.AddRange(duplicates.ToArray()); 

    //TODO: may be it should be put into "else" (no dups) 
    // Looks that you've forgot to wrap IDisposable into using... 
    using (FileStream s2 = new FileStream(_filelistlocation, 
     FileMode.Open, 
     FileAccess.Read, 
     FileShare.Read)) { 
     ... 
    } 
    } 
    else { 
    MessageBox.Show("No Dupes"); 
    } 
+0

Hat nicht funktioniert, gab mir viel zu viele Ausnahmefehler –

+0

@Robert Vasistha: Tut mir leid für Tippfehler: Es sollte 'chunk.Count()' anstelle von 'chu sein nk.Count' und 'AddRange (duplicates.ToArray())' statt nur 'AddRange (Duplikate)'; Ich habe die Antwort bearbeitet –

+0

Was zum Teufel! Es hat tatsächlich funktioniert ?! Ich bin irgendwie überrascht und verwirrt, wie ich bereits hatte. Toarray() und .count (0 von zuvor noch, als ich es erneut versuchte es funktioniert? Ich denke, es hätte Eindruck sein könnte, aber Visual Studio hätte mir gesagt, wenn es das war. Wie auch immer Danke! –

2

Anhand von Kommentaren wird die Meldung "No dupes" angezeigt, wenn Dubletten vorhanden sind. Invert Ihre if statment

if (duplicates.Count() <= 0) 
{ 
    MessageBox.Show("No Dupes"); 
    FileStream s2 = new FileStream(_filelistlocation, FileMode.Open, FileAccess.Read, FileShare.Read); 
} 
else 
{ 
    listBox1.Items.AddRange(duplicates); 
} 
Verwandte Themen