2017-01-28 8 views
0

j'ai un logiciel simple qui boucle plusieursImages/videos
et leur montrer un par un utilisant (Next) - (previous) boutonsapporter des fichiers multi-extension et arrêter les boucles lorsque la liste atteindre la fin - C#

jusqu'à présent i succès apporter qu'une seule extension dans un temps à l'aide:

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

et j'ai essayé arrêt en boucle lorsque la liste atteindre la fin en utilisant ce code:

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

excuse mes erreurs parce que je toujours Noob en C# mais quand je déboguer le dit
> IndexOutOfRangeException

et après i ajouter des extensions multiples comme ceci:

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]); 

je reçois cette erreur dit (XamlParserException) pour que celui-ci.

Si vous connaissez moyen facile d'obtenir des extensions multiples sans en utilisant beaucoup de codage comme je l'ai fait, je serai heureux de le savoir aussi mon processus de mise en boucle que vous avez vu pas bon si vous pouvez me guider vers la droite chemin, j'apprends encore ces choses c'est un peu difficile pour moi parce que je viens d'un environnement complètement différent, merci d'avance

Répondre

0

Pour obtenir une liste des noms de fichiers avec des extensions différentes utilisent Directory.EnumerateFiles et concat ces requêtes.

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(); 

Si vous voulez avoir une seule ligne de code pour votre code, écrivez un assistant comme

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; 
    } 
} 

et à l'intérieur de notre code que vous avez seulement

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

Vous ne vous inquiétez pas de la longueur d'un tableau. La liste aura le nombre d'éléments contenant dans la propriété Count.

Toutes les collections sont basées sur zéro et le premier élément a l'index 0 et le dernier élément a l'index Count-1 (collection) ou Length-1 (tableau).Vous atteignez la fin lorsque currentPosition >= mylist.Count-1 et vous pouvez augmenter l'indice aussi longtemps que currentPosition < mylist.Count-1.

Mise à jour

Il y a déjà une réponse ici sur le traitement SO avec plusieurs modèles de recherche avec une mise en œuvre parallèle

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

+0

Ce code fonctionne parfaitement avec Visual Studio 2015ff. Changez nameof (searchPatterns) en une chaîne "searchPatterns" –

+0

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

+0

Je vous ai déjà donné la réponse: liste utiliser myFiles.Count, tableau utiliser myFiles.Length. Et vous devriez lire les docs => recherche google pour "C# IList" vous mènera à MSDN –

0

Longueur renvoie le nombre d'éléments, mais il sera récupéré à partir de l'indice 0,1. Par exemple, si votre liste contient 2 enregistrements, vous pouvez accéder à l'élément dans l'index 0,1 seulement. il n'est pas disponible dans le 2ème index, donc il jette une erreur.

changement dans ImageList.Length-1

Pour obtenir tous les fichiers avec extension différente, vous pouvez utiliser EnumerateFiles avec le type d'extension *. Vous pouvez également filtrer les fichiers en utilisant la clause where.

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

@ SUB-HDR est-ce votre code complet où vous obtenir une erreur ? Partager le code complet, si facile à expliquer, je ne trouve pas de bouton là –

+0

@ SUB-HDR par exemple: string [] arr = nouvelle chaîne [] {"test1", "test2", "test3"}; array item contient 3 valeurs, donc length sera 3. mais l'index de départ de item dans array est 0 et non 1. donc accèdera à l'item dans array doit être arr [0] = "tes1", arr [1] = " test2 ", arr [2] =" test3 ". Si vous accédez à l'élément dans [3], une erreur se produit. parce que arr ne contient pas l'index 3. –

+0

Utilisez Directory.EnumerateFiles (...). Concat (Directory.EnumerateFiles (...)). ToList() –