Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Comparaison de nom de fichier C#


Sujet :

C#

  1. #1
    Membre régulier
    Comparaison de nom de fichier C#
    Bonjour tout le monde,

    Voici mon problème , j'aimerai crée une méthode qui compare tout les noms des fichiers présent dans un certain Folder, et que si par exemple deux fichiers ( Avec des extensions différentes) ont le même nom alors je peux travailler dessus.(Ex: Je zip un txt et pdf du même nom).

    J'ai pas trop d'idée de par où commencer surtout sur la comparaison.

    Je comptais utiliser des buffers mais je ne sais pas si c'est optimisé..


    Merci bcp d'avance

  2. #2
    Expert éminent sénior
    Bonjour,
    Une idée en passant: charger la liste des noms de fichier dans une liste de chaines, et utiliser une requête LINQ pour trouver les "doublons".
    Il ne te reste plus alors qu'à parcourir le résultat et traiter les fichiers.

    Tatayo.

  3. #3
    Membre régulier
    merci pour l'idée , mais admettons je fasse ma boucle qui cherche dans ma list de fichiers , dès qu'elle trouve le doublons comment je lui dit "Retourne moi les deux fichiers doublons".

    En clair si je veux les traiter il faut quelle me renvoie du style : "c://GROUP/test.txt"+"c://GROUP/test.pdf"


    Ha je viens de comprendre pardon , c'est la LINQ qui me retourne à chaque fois ma value donc ?

  4. #4
    Expert éminent sénior
    C'est ça.
    On peut par exemple imaginer une liste d'objets, avec deux membres: le nom complet du fichier, et le nom "à comparer" (ou un accesseur qui le renvoie).
    La requête LINQ va donc juste renvoyer la liste des objets qui ont "un doublon" sur cette deuxième valeur.
    On peut alors parcourir le résultat de la requête avec un simple FOREACH,et pour chaque objet on a de fait le nom complet du fichier.

    Tatayo.

  5. #5
    Membre régulier
    En gros dans l'état actuel des choses avant cette comparaison je dois faire d'autre traitement sur le dossier donc au moment où je dois comparé j'ai deux listes . Une listes contenant tout les NameWithExtension de chaque fichier et une autre list idem pour les pdf . Est-ce que la à ce moment là ca nous aide pour la requête LINQ ou est-ce que je dois comparé avant de splité les fichiers dans les listes?

  6. #6
    Membre régulier
    Pour l'instant j'ai trouvé ça comme alternative ( code ci dessous ) , je me fais afficher les pdf qui ont le même nom que des .txt présent dans la première liste.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    public void compare(List<string> listTxt, List<string> listPdf)
            {
     
                string pdf_doubl="";
     
                foreach (var pdf_File in listPdf)
                {
                    try
                    {
                        if (listTxt.Contains(pdf_File))
                        {
                            pdf_doubl = pdf_File;
                            Console.WriteLine(pdf_doubl);
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                        throw;
                    }
                }
            }

  7. ###raw>post.musername###
    Membre chevronné
    Un petit exemple de ce que l'on peut faire avec Linq :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var dictionary = Directory
    	.EnumerateFiles("C:\\Group") // liste (chemin + nom) des fichiers du répertoire C:\Group
    	.Select(Path.GetFileName) // ne garder que le nom du fichier
    	.GroupBy(f => Path.GetFileNameWithoutExtension(f.ToLower())) // regrouper par le nom en minuscule sans extension
    	.Where(g => g.Count() > 1) // ne garder que les groupes contenant plus d'un élément (c.à.d les doublons)
    	.ToDictionary(g => g.Key, g => g.ToArray()); // extraire un dictionnaire avec en clé le nom de fichier en minuscule sans extension, en valeurs des tableaux de noms de fichier
     
    foreach(var kvp in dictionary)
    {
    	Console.WriteLine($"Key : {kvp.Key}");
    	foreach(var file in kvp.Value)
    	{
    		Console.WriteLine(file);
    	}
    }


    En espérant que ça te guide dans tes recherches ; n'hésite pas à poser des questions pour mieux comprendre ce que fait chaque élément.
      1  0

  8. #8
    Membre régulier
    Salut Noxen merci pour l'exemple écoute ca marche nikel , je comprend globalement tout ce que tu m'a montré.

    Ca m'offre une opportunité d'optimisation de ma méthode , c'est vrai que LINQ offre de grande possibilités.

    Topic RESOLU merci à tous

  9. #9
    Membre régulier
    Salut tout le monde je réouvre le topic.

    Dans la requête LINQ on appel :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    .Select(Path.GetFileName)


    J'aimerai non pas qu'il cherche le non complet du fichier mais juste partie. Comment pourrais-je m'y prendre ?

    Je voulais crée une liste avec les noms des fichiers mais raccourcis et Select dessus mais ça ne marche pas..

    Merci d'avance

###raw>template_hook.ano_emploi###