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: