IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Trouver le dernier fichier créé


Sujet :

C#

  1. #1
    Membre éclairé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 702
    Par défaut Trouver le dernier fichier créé
    Bonjour,

    J’explique mon projet.

    Afin de superviser des logs sur des serveurs, je dois développer une petite application qui copie en local le fichier de log pour pouvoir afficher son contenu dans un textbox Multiline.

    Mon code à cette tête
    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
     
    DirectoryInfo rep_log = new DirectoryInfo(Path_SRVC);
                    foreach (FileInfo NextFile in rep_log.GetFiles("*Log.*"))
                    {
    // obtenir le tps de creation  
                      DateTime tmp_file = NextFile.CreationTime; 
    // l’heure a l‘instant T de l’intérrogation                    
                      DateTime tmp_maintenant = DateTime.Now;
    // Calcul du temps écoulé depuis la création
                      TimeSpan tmp_diff = tmp_maintenant.Subtract(tmp_file);
    // Intérrogation du dernier fichier
                      if (tmp_diff.TotalMinutes < 20)
                      {
    // Construction du chemin du fichier source
                            fichier_du_jour = NextFile.DirectoryName+"\\"+ NextFile.Name;
    // Copie en local
                            File.Copy(fichier_du_jour, @"c:\log.temp",true);
                      }
                    }

    Actuellement mon programme fonctionne.

    Le problème est qu’il affiche le resultat au bout de 2 min 50 sec (autant faire la manip a la main)
    La raison est qu’il existe une multitude de fichier Log puisque le serveur en génère 4 par heure et qu’il garde un historique de 15 jours.

    Ce qui fait que mon foreach passe en revue 1440 fichiers Log.
    Je ne peux pas savoir exactement le nom de mon fichier puisque il est constitué de la manière suivante :
    [Hostname]Log.[N° alèatoire * Tps process]

    Donc je voulais savoir si il n’exitait pas une méthode plus rapide pour trouver mon dernier fichier généré ?

    Je me tiens a votre disposition pour plus d’info.
    Merci d’avance

    PS : Je suis un beau novice dans le domaine de la prog.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Salut,

    2mn50 ça me semble trés long pour une simple itération sur 1500 éléments. Tu as essayé d'affiner ton diagnostic pour savoir ce qui prend du temps exactement ? Par exemple celon la taille du fichier à copier et la capacité de ton réseau, c'est peut être la copie qui prend du temps.

    Autre chose, tu dis que le serveur génère 4 fichiers de logs par heure, est ce que c'est régulier ? Si oui alors il génère un fichier toute les 15 minutes et je ne comprends pas ta clause "if (tmp_diff.TotalMinutes < 20)" qui va forcemment te faire récupérer 2 fichiers. Si la génération du fichier n'est pas régulière alors c'est pire puisque tu peux récupérer plus de deux fichiers voir même aucun .
    Le mieux pour récupérer le dernier fichier généré est surement de récupérer celui qui a la date de création la plus grande tout simplement.

  3. #3
    Membre éclairé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 702
    Par défaut
    Tu as essayé d'affiner ton diagnostic pour savoir ce qui prend du temps exactement ?
    J'ai effectivement recherché ce qu'il me prends le plus de temps et ce n'est pas l'établissement du partage puisque ce dernier prends environs 20 secondes.

    Il s'agit bien de l'intérrogation de mes 1400 fichiers.

    Enfin je le suppose puisque je ne sais pas vraiment comment le vérifier.
    Perso j'ai fais des test de la manière suivante.
    Dès l'établissement du partage affichage du contenu.(SI ok on avance le prog )
    Dès le foreach est terminé affichage des noms fichiers trouvé. (mon problème est peut être là puisque j'attends d'avoir fini mon foreach pour afficher le résultat)


    ... un fichier toute les 15 minutes et je ne comprends pas ta clause "if (tmp_diff.TotalMinutes < 20)" qui va forcemment te faire récupérer 2 fichiers.
    Les fichiers sont bien tout les 15 mintutes mais j'obtiens bien un seul nom de fichier.


    ...la taille du fichier à copier...
    Le fichier pèse 18 Ko donc la copie est fluide.

    Mon problème est vraiment trouver le bon fichier.

    Comment trouver le fichier
    qui a la date de création la plus grande tout simplement.
    ?

  4. #4
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 15
    Par défaut
    C'est normal de ne recuperer qu'un fichier...
    Tu dois en recuperer au min 1, au max, 2..., dans un délai de 20 minutes.
    Faut mettre 30 si tu veux etre certain d'en avoir 2...
    Après ca doit être plus simple, pour comparer ces 2 fichiers... Et encore plus si t'en as qu'un...

  5. #5
    Membre éclairé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 702
    Par défaut
    Donc cette partie est juste puisque j'en ai besoin que d'un seul mais celà est assez simple a réglé si je rencontrais un problème de ce type.

    Mon problème est vraiment sur ces 2min 50

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Au temps pour moi, 20 minutes c'est bon pour ne récupérer qu'un seul fichier.

    Pour continuer de debugger, si tu mets un point d'arret sur "File.Copy(fichier_du_jour, @"c:\log.temp",true);" , est-ce que tu ne passes qu'une seule fois dessus ?

    Tu peux aussi utiliser la classe StopWatch de .net pour mesurer le temps passé dans certains endroit de ton code, tu pourrais regarder la proportion de temps passée à faire des caclul sur le temps et celle passée à copier le fichier par exemple.

  7. #7
    Membre éclairé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 702
    Par défaut
    Bon après une petite modification de code.

    Les résultats sont :
    Temps total : 00:02:37.99
    Temps d'établissement partage : 00:00:01.80
    Temps du foreach : 00:02:31.80
    Temps de copie : 00:00:03.57

    Donc le problème est bien le Foreach.

    Je reviens sur une question posé précedement

    Comment trouver le fichier qui a la date de création la plus grande tout simplement.

  8. #8
    Membre éclairé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 702
    Par défaut
    Je ne vois pas comment faire pour trouver ce fichier sans consulter tout les autres.

    Y'aurais une solution c'est stoppé le foreach a la premiere occurence.
    vu qu'il n'en n'existe pas d'autre. Mais la je bloque.

    En plus avec la chance que j'ai, il va débuter sa recherche des plus vieux aux plus récents

  9. #9
    Membre averti
    Profil pro
    Développeur .NET
    Inscrit en
    Mai 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 50
    Par défaut
    Tu as essayé avec la fonction GetFileSystemInfos ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DirectoryInfo rep_log = new DirectoryInfo(Path_SRVC);
    FileSystemInfo[] fsi = rep_log.GetFileSystemInfos("*Log.*") ;
    // Chaque element de fsi contient les infos d'un fichier Log 
    //...
    Ca pourrait te permettre de récupérer toutes les infos d'un coup, et d'éviter ainsi les requêtes distantes du foreach qui doivent prendre du temps.

    Si ça ne marche pas, est-ce que tu as un accès en écriture sur le serveur, ou est-ce que tu peux modifié la façon dont il fonctionne ? Peut-être tu peux te débrouiller pour le dernier log soit créé dans un répertoire à part, pour qu'il y soit seul...

  10. #10
    Membre éclairé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 702
    Par défaut
    Citation Envoyé par pofet
    Si ça ne marche pas, est-ce que tu as un accès en écriture sur le serveur, ou est-ce que tu peux modifié la façon dont il fonctionne ? Peut-être tu peux te débrouiller pour le dernier log soit créé dans un répertoire à part, pour qu'il y soit seul...
    Ce serait trops beau !

    Sinon je n'ai pas encore eu le temps de faire la modif, mais je testerai ça.

    Par contre un collègue me dit d'utiliser un WMI.
    Il n'a pas été vraiment capable de m'expliquer ce que c'était. Mais il m'assure que c'est une sorte de requête que l'on envois au serveur et c'est lui qui fera la recherche et non mon prog.

    Et là ! Je nage super bien avec mes chaussures de plomb...

    Alors ma question est simple.

    Serait-ce ma solution ?
    Et comment dois-je m'y prendre si c'est le cas ? (EDIT : La WMI et C# partie 1 J'ai trouvé ça c'est un début )

  11. #11
    Membre éclairé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 702
    Par défaut
    Bon je viens de modifier mon script.

    Et je tiens a dire Merci pofet

    Car grace à ta proposition je suis passé de 2min50 à 13 secondes

    Enfin j'ai pas exploité ton idée dans sa globalité je pense...

    J'ai un peu triché.

    DirectoryInfo rep_log = new DirectoryInfo(Path_SRVC);
    FileSystemInfo[] fsi = rep_log.GetFileSystemInfos("*IU_REPORT.*");
    int long_fsi = fsi.Length-1;
    DateTime tmp_file = fsi[long_fsi].CreationTime;

    if (tmp_diff.TotalMinutes < 20)
    {
    // Construction du chemin du fichier source
    fichier_du_jour = NextFile.DirectoryName+"\\"+ NextFile.Name;
    // Copie en local
    File.Copy(fichier_du_jour, @"c:\log.temp",true);
    }
    }

    C'est vrai ce n'est pas propre mais je suis partie du principe que mon dernier fichier créé serait toujours le dernier de fsi[] et ça marche j'ai testé sur plusieurs serveurs

    Enfin ! j'aurais bien voulu savoir si les WMI étaient une solution

  12. #12
    Membre averti
    Profil pro
    Développeur .NET
    Inscrit en
    Mai 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 50
    Par défaut
    C'est vrai ce n'est pas propre mais je suis partie du principe que mon dernier fichier créé serait toujours le dernier de fsi[] et ça marche j'ai testé sur plusieurs serveurs
    Attention, je suis pas certain que les specs de GetFileSystemInfos indiquent que les fichiers soient renvoyés par ordre chronologique. Tu devrais faire attention à ça. Ca peut marcher aujourd'hui et si tu changes de framework ou autre, ne pous fonctionner du tout...
    Je te conseille plutôt de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DirectoryInfo rep_log = new DirectoryInfo(Path_SRVC);
    FileSystemInfo[] fsi = rep_log.GetFileSystemInfos("*IU_REPORT.*");
     
    for (int i =0; i < fsi.Length; i++) {
    if (/* fichier créé depuis moins de 20 minutes */) {
    // Construction du chemin du fichier source
    fichier_du_jour = NextFile.DirectoryName+"\\"+ NextFile.Name;
    // Copie en local
    File.Copy(fichier_du_jour, @"c:\log.temp",true);
    }
    }
    Ca ne sera pas beaucoup plus long que ta version (quelques millisecondes seulement) et ca marchera mieux.

    Par contre, il me semble que si un fichier de log est créé toutes les 15 minutes, tu récupèreras deux fichiers si tu prends une fourchette de 20 minutes. Dans ce cas, lorsque tu parcoures les fichiers, il faut que tu conserves celui qui a la date la plus élevée. Moi, j'opterai plutôt pour ça au final :
    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
    DirectoryInfo rep_log = new DirectoryInfo(Path_SRVC);
    FileSystemInfo[] fsi = rep_log.GetFileSystemInfos("*IU_REPORT.*");
     
    if (fsi.Length == 0) {
    return;
    }
     
    FileSystemInfo theLastFile = fsi[fsi.Length - 1]; // On par de la fin 
    // car d'après ce que tu dis, c'est lui le dernier fichier (optimisation)
     
    for (int i = 0; i < fsi.Length - 1; i++) {
      if (fsi[i].CreationTime > theLastFile.CreationTime ) {
        theLastFile = fsi[i];
      }
    }
     
    // theLastFile correspond bien au fichier que tu cherches

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Effectivement c'est ce que je voulais dire plus haut, récupérer le fichier qui a la date de création la plus élevée est plus sûr, mais pas de solution miracle pour ça, faut tout parcourir. Sinon bien joué pour la solution pofet, c'était bien les appels aux propriétés des fichiers distants qui consomme du temps, je n'y avais pas pensé et de tte façon je ne connaissais pas ce GetFileSystemInfos .

  14. #14
    Membre éclairé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 702
    Par défaut
    Merci de votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment trouver la dernière date de modification d'un fichier
    Par je®ome dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 24/05/2006, 14h23
  2. [D7 & Excel]Peut-on trouver la derniere ligne du fichier
    Par Isa31 dans le forum API, COM et SDKs
    Réponses: 17
    Dernier message: 14/03/2006, 11h52
  3. [dézipper]Trouver si un fichier a 1 accent dans un zip
    Par joseph_p dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 29/12/2005, 09h42
  4. Trouver ou un fichier est lancé
    Par schnourf dans le forum Shell et commandes GNU
    Réponses: 11
    Dernier message: 21/10/2005, 15h50
  5. Trouver le dernier enregistrement d'une table
    Par remi59 dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/03/2003, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo