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 :

Problème de comptage fichiers dans répertoire partagé


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2017
    Messages : 5
    Par défaut Problème de comptage fichiers dans répertoire partagé
    Bonjour,

    Voilà mon problème:
    Je partage un répertoire d'un PC Windows 2008 R2 (appelé PC1)
    Je copie 10 fichiers toutes les secondes dans ce répertoire depuis PC1
    Depuis un autre PC sous Windows 2008 R2 (appelé PC2) j'affiche le nombre de fichiers contenu dans le répertoire partagé de PC1 grâce à ce petit programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    static void Main(string[] args)
    {
    	DirectoryInfo rep = new DirectoryInfo(@"\\SERVEUR\DATA\");
    	do
    	{
                    rep.Refresh();
                    Console.WriteLine(DateTime.Now.ToString("hh:mm:ss.fff") + " Nombre de fichiers : " + rep.EnumerateFiles("*", SearchOption.TopDirectoryOnly).Count<FileInfo>());
                    if (Console.KeyAvailable)
                            break;
                    Thread.Sleep(1000);
            } while (true);
    }
    et là surprise, je n'obtient le bon nombre de fichiers a chaque boucle que si le répertoire contient plus de ( a peu prés) 440 fichiers.
    Le résultat dans le fichier joint : sortie.txt

    Par contre si j'ouvre en simultané sur PC2 un explorateur qui affiche le contenu du répertoire partagé alors tout vas bien.

    Une idée ?

  2. #2
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    Je te recommande d adopter cette solution :
    https://stackoverflow.com/questions/...-from-a-folder

    Peut être que quelqu un pourra expliquer mieux que moi pourquoi la méthode enumeratefiles au sein d un thread ne synchronise pas correctement le résultat......
    PLINQ, etc......
    Je reste en attente d'une explication clair et concise également.

    ++

  3. #3
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Tu peux te pencher vers la classe FileSystemWatcher, qui sert spécifiquement à surveiller le comportement d'un répertoire. Par contre je ne sais pas si ça fonctionne correctement sur un dossier distant.

    Sinon tu peux essayer d'utiliser Task.Delay() au lieu de Thread.Sleep() ; voire utiliser une méthode Main asynchrone (disponible avec C# 7.1) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static async Task Main(string[] args)
    {
    	// code d'origine
    	await Task.Delay(1000);
    	// code d'origine
    }
    Mais comme précédemment je ne sais pas si ça résoudra ton problème.

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Et comme ceci ?

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    static void Main(string[] args)
    {
    do
    {
    Console.WriteLine(DateTime.Now.ToString("hh:mm:ss.fff") + " Nombre de fichiers : " + (new DirectoryInfo(@"\\SERVEUR\DATA\")).EnumerateFiles("*", SearchOption.TopDirectoryOnly).Count<FileInfo>());
    if (Console.KeyAvailable)
    break;
    Thread.Sleep(1000);
    } while (true);
    }

    voir aussi directoryinfo.getfiles

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2017
    Messages : 5
    Par défaut
    Bonjour et merci a tous pour l’intérêt que vous portez a mon problème.

    Un élément important que j'ai oublié de vous préciser c'est que PC1 et PC2 sont 2 VM (VmWare)

    J'ai testé le même code avec Directory.GetFiles() et résultat identique.
    J'ai testé aussi avec les fonctions de kernel32.dll avec des DllImport et résultat identique (pas trop surprenant car il me semble avoir vu que la classe System.IO.Directory utilise
    aussi les fonctions de kernel32.dll)

    J'ai essayé ensuite avec un autre code en utilisant FileSystemWatcher et un Directory.GetFiles au déclenchement d'un événement.
    Code:
    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
    static void Main(string[] args)
    {
        if (args.Length > 0)
        {
            path = args[0];
            FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Path = Path.GetDirectoryName(path);
            watcher.Filter = "*";
            watcher.NotifyFilter = NotifyFilters.LastWrite;
            watcher.Changed += new FileSystemEventHandler(OnChanged);
            watcher.EnableRaisingEvents = true;
            Console.ReadLine();
        }
    }
    static void OnChanged(object source, FileSystemEventArgs e)
    {
         Console.WriteLine(DateTime.Now.ToString("hh:mm:ss.fff") + " " + e.ChangeType.ToString() + " " + Directory.GetFiles(path, "*", SearchOption.TopDirectoryOnly).Length.ToString());
    }
    Le résultat est meilleur : sortie3.txt

    Puis en ne prenant qu'un événement toutes les secondes
    code :
    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
    24
    static DateTime _lastEvent;
    static void Main(string[] args)
    {
        _lastEvent = DateTime.Now;
        if (args.Length > 0)
        {
            path = args[0];
            FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Path = Path.GetDirectoryName(path);
            watcher.Filter = "*";
            watcher.NotifyFilter = NotifyFilters.LastWrite;
            watcher.Changed += new FileSystemEventHandler(OnChanged);
            watcher.EnableRaisingEvents = true;
            Console.ReadLine();
        }
    }
    static void OnChanged(object source, FileSystemEventArgs e)
    {
        if (DateTime.Now.Subtract(_lastEvent).TotalMilliseconds >= 1000)
        {
            _lastEvent = DateTime.Now;
            Console.WriteLine(DateTime.Now.ToString("hh:mm:ss.fff") + " " + e.ChangeType.ToString() + " " + Directory.GetFiles(path, "*", SearchOption.TopDirectoryOnly).Length.ToString());
        }
    }
    Le résultat est pas mal : sortie4.txt

    Par contre pour expliquer pourquoi le GetFiles fonctionne dans un événement et pas dans une boucle pas évident !
    une idée d'un autre test a faire qui pourrai me mètre sur la piste ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2017
    Messages : 5
    Par défaut
    ericlm128 : j'ai essayé ta solution et le problème persiste avec GetFiles comme avec EnumerateFiles

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

Discussions similaires

  1. comptage fichier dans un répertoire windows
    Par niko77114 dans le forum Général Python
    Réponses: 2
    Dernier message: 14/02/2019, 13h53
  2. Réponses: 5
    Dernier message: 27/07/2007, 13h42
  3. Droits création-écriture fichier dans répertoire
    Par BATiViR dans le forum Delphi
    Réponses: 7
    Dernier message: 02/07/2007, 14h27
  4. Réponses: 7
    Dernier message: 12/09/2006, 15h22
  5. [TPAbbrevia] Problème ajout de fichiers dans archive
    Par Pill_S dans le forum Composants VCL
    Réponses: 4
    Dernier message: 14/10/2005, 00h18

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