J'écris une application de formulaire où il affiche tous les fichiers PDF à partir d'un répertoire dans une DataGridView.
Maintenant, le format de noms de fichiers est généralement Nom du fichier 12740-250-B STRUT> (donc fondamentalement xxxxx-xxx-x-xxxxxxxx).
Donc, le premier numéro est le numéro de projet, le deuxième numéro suivi après que le tableau de bord est le numéro de la série - et la lettre est la révision du fichier. Je voudrais avoir un bouton lorsque vous appuyez sur enfoncé, il trouvera les fichiers avec le même numéro de série (XXXXX-Series NO - REVISION - XXXXXX) et montrez-moi la dernière révision qui sera la plus grande lettre, donc entre 12763 -200-a-helloworld et à partir de 12763-200-B-helloworld, je veux que le monde 12763-200-B-Helloworld soit le résultat de ma requête. P> C'est ce que j'ai jusqu'à présent: p> merci d'avance. p> Remarque:
En fin de compte, les fichiers avec la dernière révision seront insérés dans une feuille de calcul Excel. P> p>
3 Réponses :
Assumer que votre collection est une liste de noms de fichiers résultant de Directory.getFiles (""); La linq ci-dessous fonctionnera. Pour que la ci-dessous fonctionne, vous devez être certain du format de fichier car le fractionnement est très sensible à un format de fichier spécifique. résultat strong>: p> correspondant: "12763-200-B-helloworld" p> p> p>
Vous pouvez essayer ce qui suit:
string dirPath = @"M:\Folder Directory"; string filePattern = "*.pdf"; DirectoryInfo di = new DirectoryInfo(dirPath); FileInfo[] files = di.GetFiles(filePattern, SearchOption.AllDirectories); Dictionary<string, FileInfo> matchedFiles = new Dictionary<string, FileInfo>(); foreach (FileInfo file in files) { string filename = file.Name; string[] seperatedFilename = filename.Split('-'); // We are assuming that filenames are consistent // As such, // the value at seperatedFilename[1] will always be Series No // the value at seperatedFilename[2] will always be Revision // If this is not the case in every scenario, the following code should expanded to allow other cases string seriesNo = seperatedFilename[1]; string revision = seperatedFilename[2]; if (matchedFiles.ContainsKey(seriesNo)) { FileInfo matchedFile = matchedFiles[seriesNo]; string matchedRevision = matchedFile.Name.Split('-')[2]; // Compare on the char values - https://docs.microsoft.com/en-us/dotnet/api/system.string.compareordinal?view=netframework-4.7.2 // If the value is int, then it can be cast to integer for comparison if (String.CompareOrdinal(matchedRevision, seriesNo) > 0) { // This file is higher than the previous matchedFiles[seriesNo] = file; } } else { // Record does not exist - so its is added by default matchedFiles.Add(seriesNo, file); } } // We have a list of all files which match our criteria foreach (FileInfo file in matchedFiles.Values) { // TODO : Determine if the directory path is also required for the file Console.WriteLine(file.FullName); }
Cela semble être une bonne situation pour utiliser un dictionnaire à mon avis! Vous pouvez essayer ce qui suit: