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 :

[C#][I/O] Il y a-t-il un équivalent de 'fuser' ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    Par défaut [C#][I/O] Il y a-t-il un équivalent de 'fuser' ?
    Salut,

    Je développe un hot folder, c'est à dire une petite application qui surveille l'arrivée de certains fichiers dans un répertoire donné.

    Cette surveillance est aisée, j'utilise filesystemwatcher et je branche vers une méthode lorsqu'un fichier est créé dans le répertoire en question. Le problème est que je ne peux pas vérifier si le fichier est "verouillé" ou non.

    Par exemple, un fichier est transféré via FTP et est assez gros. Dès qu'il sera créé (mais pas encore libéré par le process qui l'écrit), l'évènement "created" de filesystemwatcher va se déclencer. Si à ce moment là, j'associe une action qui nécessite la manipulation de ce fameux fichier, ça va planter puisque le fichier est toujours en train d'être copié.

    Donc, y a-t-il moyen de vérifier si le fichier est verrouillé ou pas. Sous Linux/Unix par exemple, il y a la commande "fuser". Y a-t-il une propriété ou méthode correspondante dans le framework?

    PS: je préfèrerais éviter les solutions "sales" du genre "essaye d'ouvrir le fichier et si il y a une exception c'est qu'il est toujours verrouillé..."

    Merci d'avance pour votre aide qui je le sais sera précieuse

  2. #2
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    A ma connaissance il n'y a pas d'autres manières que celles que tu appelles "pas propres", c'est à dire la gestion d'exception. Il semble ne pas y avoir de procedure "sûre" pour manipuler correctement un IsLocked

    Ou alors gère un Thread qui fasse un Thread.Sleep de 3 secondes par exemple avant de proceder à la suite du process :

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    Par défaut
    Salut,

    Merci pour tes idées. . Je ne comprends quand même pas qu'un framework tel que dotnet ne gère pas ce genre de chose. C'est quand même le beaba (pense pas que ça s'écrive comme ça mais bon ). Mais force est de constater qu'en effet, je n'ai rien trouvé non plus. Si d'autres ont déjà été confronté au problème, n'hésitez pas à partager votre expérience.

    ps: y a peut-être moyen de charger une DDL via DDLImport mais bon...

    Merci

  4. #4
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Citation Envoyé par stephane eyskens
    Salut,

    Merci pour tes idées. . Je ne comprends quand même pas qu'un framework tel que dotnet ne gère pas ce genre de chose. C'est quand même le beaba (pense pas que ça s'écrive comme ça mais bon ). Mais force est de constater qu'en effet, je n'ai rien trouvé non plus. Si d'autres ont déjà été confronté au problème, n'hésitez pas à partager votre expérience.

    ps: y a peut-être moyen de charger une DDL via DDLImport mais bon...

    Merci
    Mmmh
    C# > Java il me semble que c'est déjà faisable par Eclipse
    Mais l'inverse : j'avoue que cela dépasse très largement mes compétences à te répondre de façon judicieuse.

    Pour en revenir à ce que tu dis en premier lieu, je t'ai donné une partie de la réponse. Une proposition par le Framework d'une sorte de Bool System.IO.FileSystem.IsLocked(string filePath) , n'apporterait rien dans le sens où celà ne garantirait pas la non levée d'exception dans le cas d'un accès concurrent alors que IsLocked = false. La gestion d'exception reste incontournable. Est-ce une faille des nouvelles API.Net sur la gestion des E/S ? je n'en suis pas réellement convaincu. Peut être en effet que le monde Java (que je connais pas bien) a une approche différente du système de fichier et des processus. Tu es certainement mieux placé que moi pour le dire, notamment est-ce que l'utilisation de fuser libère d'une quelconque gestion d'exception :

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    Par défaut
    J'ai finalement géré cela via une exception et en récupérant le code de l'erreur, je peux appliquer un traitement spécifique.

    fuser ne vient pas de java, c'est une commande disponible sur les systèmes Unix/Linux qui réagit de deux manières:

    soit un fichier est libre et fuser ne renvoit rien
    soit un fichier est utilisé par d'autres process et là, fuser te renvoie la liste des process qui utilisent ce fichier.

    Donc, par exemple en shell script, très facile de savoir si un fichier est utilisé par un autre process ou non

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    checkIfUsed=`fuser "lefichier" 2>/dev/null` 
    if [ -z "${checkIfUsed}" ]
    then
     //alors fichier libre
    fi
    Voilà, donc je voulais simplement savoir si il y avait une méthode dotnet permettant de faire l'équivalent plutôt que de devoir déclencher une exception soi même.

    Merci pour ton aide

  6. #6
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Il me semble intuitivement que l'espace de noms System.Diagnostic pourrait déboucher sur une piste de solution, mais je t'avoue que je n'ai pas le temps de pousser plus loin en testant par moi même les possibilités offertes par les membres static de Process ...etc


  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    Par défaut
    Pas de problème. Merci pour ton aide. J'ai demandé à un collègue qui fait du csharp à longueur de journée et il semblerait qu'il n'y ait pas d'autre solutions, du moins pas avec le framework 1.1. J'utilise le 2.0 mais j'ai rien trouvé non plus

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

Discussions similaires

  1. équivalent lien HTML
    Par Dra_Gun dans le forum Flash
    Réponses: 3
    Dernier message: 15/12/2003, 16h25
  2. Réponses: 4
    Dernier message: 21/09/2003, 15h50
  3. Réponses: 3
    Dernier message: 21/08/2003, 14h47
  4. [postgreSQL] équivalent de la function 'instr'
    Par Dra_Gun dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2003, 16h09
  5. Équivalent du #IFDEF
    Par agh dans le forum Langage
    Réponses: 4
    Dernier message: 14/10/2002, 18h44

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