2013-03-29 1 views
-1

Je dois vérifier un dossier pour certains fichiers d'un certain type, puis les ajouter à un tableau, les imprimer et les supprimer un par un. Si un nouveau fichier est ajouté au cours du processus, il sera simplement ajouté à la file d'impression. J'essaie de savoir si un fichier est créé toutes les secondes. Pour faire cela, j'utilise un FileSystemWatcher avec un timer. J'essaye de lier les deux fonctions d'événement togheter mais j'obtiens des erreurs étranges en essayant. Je le fais dans une application de formulaire, et j'ai vu ces 2 espaces de noms pour la première fois aujourd'hui, et je ne sais rien sur le multithreading, les threads d'arrière-plan ou la différence entre System.Threading.Timer un System.Windows.Forms.Timer et lequel est le meilleur pour cette situation particulière, donc je pourrais avoir besoin d'une clarification rapide à ce sujet aussi, si le problème devient trop spécifique sur ces sujets.Minuterie avec FileSystemWatcher pour contrôler la création de fichier

Fondamentalement, le code est celui-ci (il fait partie d'un plus grand programme, donc je vais essayer de coller le code problème lié, aussi, ne vous occupez pas de l'espace de noms supplémentaire qui font partie du projet entier. Je ne sais pas comment mettre en évidence la syntaxe C# dans les blocs de code ici et l'outil de formatage avec ctrl + K a constitué ce que vous lisez dans le prochain bloc de code, j'ai essayé de le mettre un peu en retrait pour une meilleure lecture.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 
using System.Collections; 
using System.IO.Ports; 
using System.Diagnostics; 

private Timer timer1; //Windows.Form Timer 

private void button1_Click(object sender, EventArgs e) { 
    try { 
    InitTimer(); 
    FileSystemWatcher SysWatch = new FileSystemWatcher(FilesPath, "*.*"); 
    SysWatch.Created += new FileSystemEventHandler(SysWatch_Created); 
    SysWatch.EnableRaisingEvents = true; 
    } 
    catch (Exception exc) { 
    MessageBox.Show(exc.Message); 
    } 
} 

private void InitTimer() { 
    timer1 = new Timer(); 
    timer1.Tick+=new EventHandler(timer1_Tick); 
    timer1.Interval = 2000; 
    timer1.Start(); 
} 

private void timer1_tick (object sender, EventArgs xz) { 
    void SysWatch_Created(object Sender, FileSystemEventArgs w) { 
    MessageBox.Show("File " + w.FullPath + "Creato"); 
    } 
} 

ce que je voulais faire est d'essayer d'imbriquer le contrôleur d'événement de création de fichier à l'intérieur de la minuterie afin qu'il vérifie la création de fichiers, mais probablement il y a quelque chose de mal dans la façon dont je le fais.

Je reçois ce genre de choses (Juste quand j'essaye d'imbriquer SysWatch_Created dans timer1_Tick, jusque là tout fonctionnait parfaitement).

enter link description here

Je pense qu'il a quelque chose à voir avec le fait que je suis en train de nicher 2 méthodes avec Args événement ou quelque chose ... Je ne sais pas

Tout exemple sur la façon de faire c'est mieux c'est la bienvenue.

Merci à tous.

+0

Votre mise en forme a foiré parce que votre éditeur de code utilise des onglets comme onglets et non comme des espaces. –

+0

Vous devez d'abord écrire un code valide. Vous ne pouvez pas imbriquer une méthode dans une autre méthode. Ensuite, vous devez écrire * sane * code. Il n'y a absolument rien que vous puissiez faire pour un autre processus de création de fichier. Vous ne pouvez pas le retarder et vous ne pouvez pas l'empêcher. –

Répondre

2

Vous ne pouvez pas placer une méthode dans une méthode comme celle-ci, ou un gestionnaire d'événements dans un gestionnaire d'événements, tel qu'il est; Vous devrez définir le gestionnaire FileSystemWatcher aux côtés du le gestionnaire de minuteur. Mais votre observateur effectuera le contrôle du style de ticking pour vous et déclenchera l'événement lorsque se produira en fonction de celui-ci, et non de votre minuteur.

Pour expliquer un peu, il serait logique de le mettre comme ça, et vous n'avez pas cette erreur particulière (ou un ensemble d'erreurs) plus:

private void timer1_tick (object sender, EventArgs xz) { 

} 

void SysWatch_Created(object Sender, FileSystemEventArgs w) { 
    MessageBox.Show("File " + w.FullPath + "Creato"); 
} 

Cependant, alors vous avez encore besoin pour l'appeler à l'intervalle, et appeler manuellement la méthode de gestionnaire n'a pas beaucoup de sens ici. Considérez ce qui suit:

private void timer1_tick (object sender, EventArgs xz) { 
    SysWatch_Created(this, null); 
} 

L'expéditeur peut attendre d'être un FileSystemWatcher, mais pas nécessairement qui est la moindre inquiétude: sinon, qu'est-ce que vous vous attendez à passer pour où je place null dans ce cas? Seul l'observateur a cette information dans ce contexte.

Retour au point. Vous n'avez pas besoin d'une minuterie, FileSystemWatcher fera l'interrogation en interne et vous informer, parce que vous dites à (Created += new FileSystemEventHandler(SysWatch_Created);). Cependant, vous ne pouvez pas définir spécifiquement l'intervalle d'interrogation de cette chose.

+0

Ok, merci. J'ai eu le suspect que mettre une minuterie sur une écoute continue d'une méthode n'avait pas beaucoup de sens, mais j'avais besoin d'une confirmation. Si vous lisez encore ceci, j'aimerais vous poser une dernière question. J'utilise ceci pour envoyer des fichiers créés (txt) à une imprimante de billets de série. Si certains fichiers existent déjà dans le dossier, ils seront imprimés, pendant que filesyswatcher enverra les nouveaux fichiers à imprimer. Pensez-vous que les nouveaux fichiers à imprimer seront à la fin du processus d'impression ou qu'ils seront simplement imprimés au milieu? –

Questions connexes