7
votes

FileSystemwatcher ne fonctionne pas correctement lorsque de nombreux fichiers sont ajoutés au répertoire en même temps

FileSystemwatcher ne fonctionne pas correctement lorsque de nombreux fichiers sont ajoutés au répertoire en même temps ...

L'observateur ne trouve tout simplement pas tous les fichiers du répertoire - uniquement si les fichiers sont placés dans le dossier un par un - non si de nombreux fichiers sont copiés dans le dossier en même temps ...

est la création de threads la solution au problème ou existe-t-il une autre façon de gérer le problème?


1 commentaires

Gardez à l'esprit que le système de fichiers Systemwatcher s'appuie sur le système d'exploitation à signaler lorsque des fichiers sont ajoutés / modifiés / supprimés / etc. Donc, avoir plusieurs cas ne vont pas aider.


3 Réponses :


12
votes

le Documentation sur cette classe Détails de ce problème :

Le système d'exploitation Windows notifie votre composant des modifications de fichier dans un tampon créé par le fichier de fichiers Systemwatcher. S'il y a beaucoup de changements dans une courte période, le tampon peut déborder. Cela entraîne la perte de la piste des modifications de l'annuaire et ne fournira que la notification générale. Augmentation de la taille du tampon avec le interrogebuffersize La propriété est chère, car il provient de la mémoire non pagaie qui ne peut pas être échangé sur le disque, alors gardez le tampon aussi petit mais suffisamment grand pour ne manquer aucun événement de changement de fichier. Pour éviter un débordement de mémoire tampon, utilisez le notifyfilter et InversubDirectories propriétés afin que vous puissiez filtrer indésirable Modifier les notifications.

Alors, les threads ne vous aideront probablement pas beaucoup dans ce cas. Vous voulez probablement augmenter la taille de la mémoire tampon (mais à quel point il doit être important peut-être dépendre de la vitesse de l'ordinateur et du disque lui-même) ou de contraindre les fichiers qui vous intéressent en définissant le filtre approprié.


3 commentaires

Et, bien sûr, une autre option consiste à interroger en outre le dossier des nouveaux fichiers et fichiers qui ont été manqués.


Je sous-estime parfois C #, .NET, etc. depuis que le développement dans Microsoft World est facile (en disant "Microsoft aurait dû penser que pour moi aussi ...") Et se comporter de manière cotaire alors ne lisez pas de la documentation, puis de mettre des heures dans de petites choses comme celui-ci lol


@Dirkvollmar Comment feriez-vous cela? Pouvez-vous relancer artificiellement des événements pour des fichiers qui résident déjà dans le dossier?



0
votes

Essayez quelque chose comme ça. XXX


0 commentaires

1
votes

C # est nouveau pour moi et j'ai eu du mal avec le même problème pendant près d'une semaine. J'avais ceci:

    public void onCreated(object sender, FileSystemEventArgs e)
    {
        stringBuilder.Remove(0, stringBuilder.Length);
        stringBuilder.Append(e.FullPath);
        stringBuilder.Append(" ");
        stringBuilder.Append(e.ChangeType.ToString());
        stringBuilder.Append("    ");
        stringBuilder.Append(DateTime.Now.ToString());
        updateNotifications = true;
        Invoke((Action)(() => {notificationListBox.Items.Insert(0, stringBuilder.ToString());}));
    }


0 commentaires