0
votes

C # String Query - Obtenir la dernière révision de fichier

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 (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.

C'est ce que j'ai jusqu'à présent: xxx

merci d'avance.

Remarque: En fin de compte, les fichiers avec la dernière révision seront insérés dans une feuille de calcul Excel.


0 commentaires

3 Réponses :


0
votes

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. xxx

résultat :

correspondant: "12763-200-B-helloworld"


0 commentaires

0
votes

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


0 commentaires

0
votes

Cela semble être une bonne situation pour utiliser un dictionnaire à mon avis! Vous pouvez essayer ce qui suit: xxx


0 commentaires