J'ai une liste déroulante appelée comboFileTypes
. À l'intérieur se trouve une liste déroulante contenant:
var files = Directory .EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories) .Where(s => s.EndsWith(".mp4") || s.EndsWith(".mov") || s.EndsWith(".vob") || s.EndsWith(".MP4") || s.EndsWith(".MOV") || s.EndsWith(".VOB"));
Et après avoir appuyé sur un bouton, j'ai le code suivant pour rechercher des fichiers dans un répertoire:
MP4 MOV MKV VOB
Qui est codé en dur. Je veux que l'option WHERE
soit générée dynamiquement à partir de la liste déroulante à la place, afin que l'utilisateur puisse ajouter un autre type de fichier s'il en a besoin. (Aussi insensible à la casse, si c'est possible, sinon je vais simplement ajouter les deux cas)
Toute aide serait appréciée.
5 Réponses :
Vous pouvez obtenir des valeurs de ComboBox par
var files = Directory .EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories) .Where(s => values.Any(v => s.EndsWith(v, StringComparison.OrdinalIgnorecase));
et l'utiliser comme ceci:
var values = comboFileTypes.Items.Cast<string>()
Cela a l'air bien, mais je reçois un soulignement rouge sur le ComboBoxItem
, l'espace de noms est introuvable?
Bien mieux: Where (s => values.Any (v => s.EndsWith (v, StringComparison.OrdinalIgnorecase));
. Cela couvre également les extensions de fichiers à casse mixte comme par exemple ".Mp4".
@ KlausGütter Oui, vous avez absolument raison! J'ai mis à jour la réponse.
Eh bien, il me manque peut-être quelque chose de gros, mais ...
void onOpen() { string[] items = new string[ comboFileTypes.Items.Length ]; foreach(int i = 0; i < items.Length; ++i) { items[ i ] = "." + comboFileTypes.Items[ i ].ToString(); } var files = new List<string>(); var allFiles = Directory.EnumerateFiles( sourceDIR.Text, "*.*", SearchOption.AllDirectories ); foreach(string ext in items) { files.AddRange( allFiles.Where( s => s.EndsWith( ext ) ); } // ...more things... with files... return; }
La clé ici est que ComboBox a un SelectedItem em > propriété, qui peut être null
si rien n'est sélectionné, ou maintenir l'option sélectionnée.
Si vous souhaitez sélectionner toutes les extensions, vous pouvez utiliser les éléments propriété.
void onOpen() { var selected = comobFileTypes.SelectedItem; if ( selected != null ) { string ext = "." + selected.ToString(); var files = Directory.EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories).Where( s => s.EndsWith( ext ); // ...more things... } return; }
J'espère que cela vous aidera.
Merci - mais cela n'ajoute que l'élément sélectionné dans la liste déroulante, je les veux tous.
Récupérez toutes les extensions de la zone de liste déroulante:
var files = extensions.AsParallel().SelectMany(x => Directory.EnumerateFiles(sourceDIR.Text, "*" + x, SearchOption.AllDirectories));
Rechercher en ignorant la casse en énumérant tous les fichiers du répertoire:
var files = Directory.EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories).Where(x => extensions.Any(y => y.Equals(Path.GetExtension(x), StringComparison.OrdinalIgnoreCase)));
Vous pouvez également rechercher pour les extensions spécifiées uniquement:
var extensions = comboFileTypes.Items.Cast<string>().Select(x => "." + x);
essayez ce code:
List<string> items = new List<string>(); for (int i = 0; i < comboBox1.Items.Count; i++) { items.Add(comboBox1.Items[i].ToString().ToLower()); } var files = Directory .EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories) .Where(file => items.Any(item => file.ToLower().EndsWith(item)));
une autre possibilité serait d'utiliser le modèle de recherche. Malheureusement, il n'est pas possible de rechercher plusieurs modèles à la fois. Mais vous pouvez utiliser SelectMany
pour parcourir la liste des modèles et aplatir les résultats de la recherche en une seule liste:
var allPatterns = comboFileTypes.Items.Cast<string>(); allPatterns.SelectMany(pattern => Directory.EnumerateFiles(@"F:\temp", $"*.{pattern}", SearchOption.AllDirectories));
Les noms de fichiers seront classés comme la liste des modèles p>
voulez-vous rechercher l'élément sélectionné? ou tous les éléments / fichiers dans la liste déroulante?
@MongZhu Tous les fichiers se terminant par les extensions répertoriées dans la liste déroulante. Actuellement, ils sont codés en dur, ce qui n'est pas ce que je veux.
Quel est le rôle de la combo box dans le scénario? L'utilisation peut simplement sélectionner un seul élément dans
ComboBox
. Parlez-vous peut-être d'une zone de liste à sélection multiple d'une liste de contrôle? Ou s'il s'agit d'un seul élément de zone de liste déroulante, contient-il plusieurs extensions séparées par | ou quelque chose?Quoi qu'il en soit, utilisez l'une des solutions ici: Comment filtrer Directory.EnumerateFiles avec plusieurs critères? . Vous avez juste besoin d'obtenir les extensions de quelque part, d'un élément, des éléments sélectionnés ou .....