2017-01-28 1 views
0

ich habe eine einfache Software, die Schleife MultiImages/videos
und sie eins nach dem anderen mit (Next) zeigen - (previous) TastenMulti-Dateien Erweiterung bringen und Looping sie stoppen, wenn die Liste das Ende erreichen - C#

bisher i Erfolg bringen nur eine Verlängerung in einer Zeit mit:

string[] FileList = Directory.GetFiles(Dir, "*.jpg", SearchOption.AllDirectories); 

und ich versuchte Anschlag Looping, wenn die Liste, indem Sie diesen Code das Ende erreichen:

int currentPosition = 0; 
if (currentPosition != ImageList.Length) currentPosition++; 

Entschuldigung meine Fehler, weil ich immer noch in C# Noob, aber wenn ich seine debuggen sagt
> IndexOutOfRangeException

und nach i hinzufügen Multi-Erweiterungen wie folgt aus:

string[] VOut_AVI = Directory.GetFiles(@Curr_DirectoryName, "*.avi", SearchOption.AllDirectories); 
    string[] VOut_MP4 = Directory.GetFiles(@Curr_DirectoryName, "*.mp4", SearchOption.AllDirectories); 
    string AddMP4 = VOut_MP4[VOut_MP4.Length - 1]; 
    //------ Adding other format to our call ------------ 
    Array.Resize(ref VOut_AVI, VOut_AVI.Length + 1); 
    VOut_AVI[VOut_AVI.Length - 1] = AddMP4; 

    // just for test ----->> 
    MessageBox.Show("Video link : " + VOut_AVI[currentPosition]); 

ich diese Fehlermeldung erhalten, sagte (XamlParserException) für diesen einen.

wenn Sie wissen, einfache Möglichkeit, Multi-Erweiterungen zu erhalten, ohne mit, dass viel von Codierung, wie ich mir habe glücklich sein zu wissen, dass es mein Looping Prozess auch, wie Sie nicht so gut gesehen, wenn Sie mich nach rechts führen können so, ich bin immer noch lernen diese Dinge ist es ein bisschen schwer für mich, weil ich komme aus einer völlig anderen Umgebung, danke im Voraus

Antwort

0

Um eine Liste von Dateinamen mit verschiedenen Erweiterungen zu bekommen verwenden Directory.EnumerateFiles und diese Abfragen verketten.

IEnumerable<string> myFilesQuery = new string[] { }; 

myFilesQuery = myFilesQuery.Concat(Directory.EnumerateFiles(dir, "*.avi", SearchOption.AllDirectories)); 
myFilesQuery = myFilesQuery.Concat(Directory.EnumerateFiles(dir, "*.mp4", SearchOption.AllDirectories)); 
myFilesQuery = myFilesQuery.Concat(Directory.EnumerateFiles(dir, "*.jpg", SearchOption.AllDirectories)); 

// nothing will happen until we call 

IList<string> myFiles = myFilesQuery.ToList(); 

Wenn Sie einen für Ihren Code einzeilige-of-Code haben, einen Helfer wie

public static class DirectoryHelper 
{ 
    public static IEnumerable<string> EnumerateFiles( 
     string path, 
     SearchOption searchOption, 
     params string[] searchPatterns) 
    { 
     if (searchPatterns == null) 
      throw new ArgumentNullException(nameof(searchPatterns)); 

     IEnumerable<string> result = new string[] { }; 

     foreach (var searchPattern in searchPatterns) 
     { 
      result = result.Concat(Directory.EnumerateFiles(path, searchPattern, searchOption)); 
     } 

     return result; 
    } 
} 

und in unserem Code schreiben, müssen Sie nur

IList<string> myFiles 
    = DirectoryHelper 
     .EnumerateFiles( 
      dir, 
      SearchOption.AllDirectories, 
      "*.avi", "*.mp4", "*.jpg") 
     .ToList(); 

Sie Sie müssen sich keine Gedanken über die Länge eines Arrays machen. Die Liste enthält die Anzahl der Elemente, die die Eigenschaft Count enthalten.

Alle Sammlungen sind nullbasiert und das erste Objekt hat den Index 0 und das letzte Objekt hat den Index Count-1 (Sammlung) oder Length-1 (Array).Sie erreichen das Ende wenn currentPosition >= mylist.Count-1 und Sie können den Index so lange wie currentPosition < mylist.Count-1 erhöhen.

aktualisieren

Es gibt bereits eine Antwort hier auf SO mit mehreren Suchmuster mit einer parallelen Implementierung Umgang

https://stackoverflow.com/a/3754470/1744164

+0

Dieser Code läuft perfekt mit Visual Studio 2015ff. Ändern Sie den Namen von (searchPatterns) in eine Zeichenfolge "searchPatterns" –

+0

nameof Doc: https://msdn.microsoft.com/library/dn986596.aspx –

+0

Ich gab Ihnen bereits die Antwort: Liste verwenden myFiles.Count, Array verwenden myFiles.Length. Und Sie sollten die Dokumente lesen => Google-Suche nach "C# IList" führt Sie zu MSDN –

0

Länge gibt die Anzahl der Elemente, aber es wird von Index 0,1 abgerufen.

Zum Beispiel, wenn Ihre Liste insgesamt 2 Datensätze, dann können Sie den Artikel nur in 0,1 Index zugreifen. es ist nicht im 2. Index verfügbar, daher wird ein Fehler ausgegeben.

Wechsel in ImageList.Length-1

Um alle Dateien mit anderer Erweiterung erhalten Sie EnumerateFiles mit Erweiterungstyp * nutzen könnten. Sie können die Dateien auch mit der where-Klausel filtern.

var resufile = Directory.EnumerateFiles(@"fullpath", "*.*", SearchOption.AllDirectories) 
      .Where(s => s.EndsWith(".mp4") || s.EndsWith(".jpg")); //different extension you can specify it 
+0

@ SUB-HDR ist diese Ihren vollständigen Code, in dem Sie einen Fehler bekommen ? Teilen Sie den vollen Code, so einfach zu erklären, ich kann keine Taste dort finden –

+0

@ SUB-HDR für zB: string [] arr = new string [] {"test1", "test2", "test3"}; Array-Element enthält 3 Werte, so dass die Länge 3 ist. Aber der Startindex des Elements im Array ist 0 und nicht 1. Daher muss auf das Element im Array zugegriffen werden. arr [0] = "tes1", arr [1] = " test2 ", arr [2] =" test3 ". Wenn Sie auf das Element in arr [3] zugreifen, wird ein Fehler ausgegeben. Weil arr keinen Index 3 enthält –

+0

Verwenden Sie Directory.EnumerateFiles (...) .Concat (Directory.EnumerateFiles (...)). ToList() –

Verwandte Themen