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

WinDev Discussion :

Utilisation de la classe .NET System.IO.File [WD16]


Sujet :

WinDev

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 27
    Par défaut Utilisation de la classe .NET System.IO.File
    Bonjour à tous,

    Ce thread contient deux questions, la première est est purement technique et la seconde porte sur la conception. Le but de la manœuvre étant de savoir si un fichier (texte tout simple) est utilisé par un autre processus, toujours en cours d'utilisation.

    Après quelques recherches, il semble que l'utilisation de la méthode Create() de la classe File, contenue dans le namespace System.IO de mscorlib.dll (ou l'API de laquelle est tirée cette méthode), permette cela, en levant une exception si on tente de créer un fichier avec le même nom que le fichier que l'on est en train de tester, si celui-ci est en cours d'utilisation. Donc :

    1. Je rencontre des problèmes pour utiliser la classe System.IO.File. J'ai intégré mscorlib comme assemblage .NET, je vois la classe et je peux déclarer une variable en tant que System.IO.File. Cependant la quasi totalité de ses membres et méthodes sont inaccessibles (lire : n'apparaissent pas dans le menu déroulant induit par "MaClasse:"). En fait j'ai 5 méthode dispo (génriques à quasiment toutes les objets .net) contre plusieurs dizaines sur la classe ciblée. J'ai bien essayé de forcer en tapant en dur le nom de la méthode mais elle n'existe pas dans cette classe manifestement. J'ai l'impression qu'une autre classe de même nom masque les propriétés de celle que je veux. Avez-vous des idées ou expériences à ce sujet à partager ? Je n'ai pas vraiment envie de passer par les API alors que je devrais pour utiliser cette classe, pour être honnête .

    2. Connaissez-vous une autre façon de faire ?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Par défaut
    Salut !

    Je n'ai pas bien compris quel est ton objectif.
    As-tu vraiment besoin de chercher ailleurs que dans le framework Windev ?
    Quelques fonctions utiles: fCrée, fOuvre, fFichierExiste.

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 246
    Par défaut
    Bonjour,
    dans la doc .net c'est écrit :
    Fournit des méthodes statiques pour créer, copier, supprimer, déplacer et ouvrir des fichiers et facilite la création d'objets FileStream.

    ça veut dire qu'on ne va pas pouvoir par exemple manipuler une variable de type File ( d'ailleurs il n'y a pas de constructeur dans cette classe) et alors pour utiliser sa méthode create on va écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    File.Create("f:\LeFichier.txt")
    Ami calmant, J.P

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 27
    Par défaut
    Citation Envoyé par OnePoint Voir le message
    Salut !

    Je n'ai pas bien compris quel est ton objectif.
    As-tu vraiment besoin de chercher ailleurs que dans le framework Windev ?
    Quelques fonctions utiles: fCrée, fOuvre, fFichierExiste.
    Salut OnePoint!

    Avec les fonctions du WLangage, telles que celle citées ou même FBloque, je n'ai pas réussi à savoir si le fichier était en cours d'écriture (d'utilisation à parler général), je cherche donc des solutions ailleurs.
    Citation Envoyé par jurassic pork;
    Fournit des méthodes statiques pour créer, copier, supprimer, déplacer et ouvrir des fichiers et facilite la création d'objets FileStream.
    Bonjour JP,
    Je suis passé à côté du mot statique en effet

    J'ai regardé et la manière que tu décris semble fonctionner. Je reviendrai lorsque j'aurai eu le temps de tester le bouzin. Merci OnePoint et JP

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 27
    Par défaut
    Donc cela fonctionne !

    Je monitore l'arrivée de fichiers (.txt) en branchant un évènement sur la création de fichiers dans un répertoire spécifique et déclenche une procédure de surveillance du fichier fraîchement créé dès qu'il arrive.

    Cette procédure qui utilisait à l'origine la méthode File.Create utilise maintenant File.OpenWrite, ce qui permet de ne pas écraser le fichier avec un nouveau fichier vide dès que je peux en obtenir les droits (mieux )

    Tant que le fichier est en cours d'utilisation une exception est levée lors de l'appel à la méthode File.OpenWrite, ce qui permet de savoir lorsque je peux le traiter.

    Maintenant il me reste à trouver comment brancher plusieurs évènements en même temps car pour le moment, même si je peux monitorer plusieurs fichiers en re-branchant l'évènement dès que l'évènement précédent est déclenché, le résultat du second évènement ne me parvient qu'après que le premier est terminé, même si le second fichier est disponible avant le premier :

    /* initialisation du projet */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // On lance la surveillance sur le dossier de réception
    PK_Monitor.FU_Surveiller( "C:\temp")
    /* PK_Monitor.FU_Surveiller */
    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
     
    PROCEDURE FU_Surveiller( Ps_Dossier est une chaîne )
     
    //Déclaration des "objets" .NET
    Vcl_FolderWatcher est un System.IO.FileSystemWatcher
    Vpcl_MonHandler est un System.IO.FileSystemEventHandler dynamique
     
    //Procédure de traitement
    Vpcl_MonHandler = DotNetDélégué( "PR_OnCreate","FileSystemEventHandler" )
     
    // Répertoire à surveiller
    Vcl_FolderWatcher:Path = Ps_Dossier
     
    // Sans les sous-répertoire
    Vcl_FolderWatcher:IncludeSubdirectories = False
     
    // Type de fichiers à surveiller
    Vcl_FolderWatcher:Filter = "*.txt"
     
    // Action à l'ajout d'un fichier
    Vcl_FolderWatcher:add_Created( Vpcl_MonHandler )
     
    // Activation de la surveillance
    Vcl_FolderWatcher:EnableRaisingEvents = True
    /* PK_Monitor.PR_OnCreate */
    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
     
    PROCEDURE PR_OnCreate( ...
    	Ppcl_MonWatcher est un FileSystemWatcher	,...
    	Ppcl_Args 		est un FileSystemEventArgs	)
     
     
    // On relance la surveillance sur le dossier de réception aussitôt
    PK_Monitor.FU_Surveiller( Vgs_DossRCP )
     
    TANTQUE PAS FU_CheckFichier(  Ppcl_Args:FullPath )
    	PK_ToolAgent.PR_EcritLog(  Ppcl_Args:FullPath + " non  disponible" )
    	Multitâche( 200 )
    FIN
     
    PK_ToolAgent.PR_EcritLog(  Ppcl_Args:FullPath + " DISPONIBLE !" )

    /* PK_Monitor.FU_CheckFichier*/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    FONCTION FU_CheckFichier( Ps_NomFichier est une chaîne )
     
    Vpcl_StreamReader est un StreamReader dynamique
     
    QUAND EXCEPTION DANS
    	Vpcl_StreamReader = File.OpenWrite( Ps_NomFichier )
    FAIRE
    	RENVOYER Faux
    FIN
    // On referme le fichier
    Vpcl_StreamReader:Close()
    RENVOYER Vrai


    Résultats dans le log :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    C:\temp\Test.txt non  disponible
    C:\temp\Test.txt non  disponible
    C:\temp\Test.txt non  disponible
    C:\temp\Test.txt non  disponible
    C:\temp\Test.txt DISPONIBLE !
    C:\temp\Test2.txt DISPONIBLE !
    C:\temp\Test2.txt DISPONIBLE !
    Alors que le Test.txt fait 9Mo et que Test2 fait 100Ko, et que le téléchargement de Test2 a été lancé après Test1 et que son téléchargement s'est terminé avant la fin de celui de Test1.

    Aussi on voit deux "C:\temp\Test2.txt DISPONIBLE !" ... A creuser, mais si vous avez des idées, ne vous génez pas. Le code est aussi à disposition.

    EDIT : J'ajoute que les classe .NET utilisées sont dans SYSTEM et MSCORLIB

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

Discussions similaires

  1. Utilisation d'une classe .NET
    Par Yndigos dans le forum WinDev
    Réponses: 3
    Dernier message: 31/08/2012, 04h08
  2. Utilisation de la classe System.net.dns en VBS ?
    Par Striper dans le forum VBScript
    Réponses: 0
    Dernier message: 11/08/2011, 12h25
  3. Réponses: 1
    Dernier message: 28/03/2007, 12h01
  4. Réponses: 9
    Dernier message: 08/02/2006, 12h46
  5. Réponses: 2
    Dernier message: 18/05/2004, 14h12

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