none
FileSystemWatcher pour un projet ASP.NET RRS feed

  • Question

  • Bonjour,

     

    Pour mon projet, j'ai besoin de mettre en place un système d'écoute sur un dossier et d'effectuer certains traitements lors de la création de fichiers dans celui ci.

    Pour ceci, je me suis orienté vers la classe FileSystemWatcher.

    Cependant, je ne sais pas vraiment comment la garder en vie ni où la déclarer.

    J'ai parcouru plusieurs forums et j'ai vu que la solution du fichier global.asax revenait souvent alors j'ai voulu tester:

     

    /* Global.asax.cs */
    
        public class Global : System.Web.HttpApplication
        {
            protected void fsw_Created(object sender, FileSystemEventArgs e)
            {
    
                 // executer mon traitement ici.
            }
    
            protected void Application_Start(object sender, EventArgs e)
            {
                Context.Response.Write("application started");
                FileSystemWatcher fsw = new FileSystemWatcher("C:\\FTPserver\\");
                Application.Add("myfsw", fsw);
                fsw.Created += new System.IO.FileSystemEventHandler(fsw_Created);
                fsw.EnableRaisingEvents = true;
                fsw.IncludeSubdirectories = true;
            }
    
            protected void Application_End(object sender, EventArgs e)
            {
                FileSystemWatcher fsw = (FileSystemWatcher)Application["myfsw"];
                Application.Remove("myfsw");
                fsw.Dispose();
            }
        }
    }
    
    Cependant, je ne sais pas s'il est correct d'ajouter une méthode dans ce fichier. De plus, celà ne me permet pas de faire un traitement spécifique en fonction de mes sessions etc. Mettons que plusieurs utilisateurs soient connectés, je voudrais eviter que les fichiers des uns atterrissent chez les autres ^^".

    Pour detailler un peu, j'ai besoin lors de l'evenement, de connaitre le chemin où je vais déplacer mon fichier mais il dépend des variables de session et d'une requete sur ma base de donnée.

     

    J'ai donc plusieurs questions:

    Est-ce correct d'effectuer mes traitements depuis le global.asax? Et comment puis-je récupérer les infos dont j'ai besoin (variables sessions et requete sur la bdd) depuis ici?

    Sinon, comment attacher une méthode présente dans un autre fichier/ une autre classe à l'evenement Created du FileSystemWatcher?

    Comment le garder en vie?

     

    voilà dans l'attente de vos conseils,

    Erwan

    mardi 13 décembre 2011 10:36

Réponses

  • Si on veut juste dupliquer les dossiers tels que il doit y avoir un "service de réplication" (http://support.microsoft.com/kb/311398/fr et poser plutôt des questions dans un groupe d'admin Windows).

    Si le problème est que l'on a deux serveurs web, on peut aussi stocker les données dans un dossier commun aux deux serveurs.

    Si on veut une logique perso, il faudrait sans doute l'écrire soi-même.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse Erwanage mardi 13 décembre 2011 15:11
    mardi 13 décembre 2011 12:48
    Modérateur

Toutes les réponses

  • Bonjour,

    Ces fichiers sont créés comment ? Si ils sont créés par l'appli web, intégrer ce traitement au moment de leur création serait plus simple ?

    Sinon, le filesystemwatcher ne sera pas actif lorsque l'application web n'est pas active (et si c'est le cas je ne vois pas pourquoi on lierait ce fichier à une session plutôt qu'à une autre).

    Dans un premier temps, je pense qu'il faudrait plutôt nous faire comprendre la fonctionnalité générale (on classe des fichiers "uploadés" par les utlisateurs ou un système externe génère des fichiers qui sont traités par les utilisateurs d'une application web ?)


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mardi 13 décembre 2011 10:46
    Modérateur
  • Merci avant tout de votre réponse rapide.

     

    Pour résumer le projet;

    Dans un premier temps, l'utilisateur upload un fichier.

    Ce fichier est envoyé, avec un id unique, via ftp sur un serveur qui va le traiter et me le renvoyer.

    Ensuite, c'est la que doit intervenir le FSW, je déplace ces fichiers reçu du répertoire de réception vers le répertoire de mon application afin de les classer correctement.

     

    J'hésitait entre 2 possibilités pour le faire: soit le FileSystemWatcher, soit une classe FTP en écoute qui téléchargerait mon fichier vers le répertoire de réception.

    La premiere m'ayant paru plus simple, je me suis orienté vers le FileSystemWatcher.

     

    Avez vous besoin de plus de précisions?

    mardi 13 décembre 2011 11:03
  • Je pense qu'une application séparée (éventuellement service windows) serait plus appropriée. Je crois comprendre que l'on aurait donc :

    - l'utilisateur charge un fichier (via http ?) vers l'appli (je crois comprendre que l'upload par l"utilisateur et l'upload via ftp sont bien deux étapes distinctes)
    - ce fichier est envoyé vers un site FTP qui le traite et le renvoie (au bout d'un délai variable ? éventuellement long ? l'utilisateur pourrait avoir quitté le site ? l'application web pourrait ne pas être en cours d'utilisation ?)

    A réception du fichier, je pense que le fichier est renvoyé avec un id semblable au fichier envoyé donc l'appli saura quelle est l'utlisateur concerné en enregistrant les id des fichiers dans une base.

    Le traitement des fichiers aurait lieu indépendamment de l'appli web (et donc notamment même si l'utilisateur a quitté sa sesssion peut-être en lui envoyant un mail pour lui signaler que le fichier a été traité).

    Pour l'instant je dirais :
    - peut on guarantir que l'utilisateur (voir même un utilisateur qq) sera encore connecté lorsque le serveur FTP renvoie le fichiet traité
    - pour obtenir ce résultat on voit parfois le lancement d'une autre thread depuis l'appli web pour que le traitement reste toujours actif. Je ne suis pas un grand fan de cette solution. Si le filesystemwatcher doit être opérationnel même lorsque l'appli web n'est plus active, il semble plus logique de faire une appli séparée.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mardi 13 décembre 2011 11:42
    Modérateur
  • En effet, cela parait plus simple de faire ça via une application extérieur pour être sur de déplacer tous les fichiers.

    Existe-t-il des services windows qui font le font déjà?

    mardi 13 décembre 2011 12:05
  • Si on veut juste dupliquer les dossiers tels que il doit y avoir un "service de réplication" (http://support.microsoft.com/kb/311398/fr et poser plutôt des questions dans un groupe d'admin Windows).

    Si le problème est que l'on a deux serveurs web, on peut aussi stocker les données dans un dossier commun aux deux serveurs.

    Si on veut une logique perso, il faudrait sans doute l'écrire soi-même.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse Erwanage mardi 13 décembre 2011 15:11
    mardi 13 décembre 2011 12:48
    Modérateur
  • Merci je vais me renseigner la dessus.
    mardi 13 décembre 2011 15:11