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 :

comment vérifier si un fichier est ouvert avant de le supprimer.


Sujet :

C#

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 105
    Points : 90
    Points
    90
    Par défaut comment vérifier si un fichier est ouvert avant de le supprimer.
    salut tt le monde

    ma question est simple

    comment vérifier si un fichier est ouvert avant de le supprimer. parce que si non il y aura un message d'erreur

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Ben tu peut le supprimer et entourer la suppression d'un try-catch pour attrapper l'erreur. Je ne crois pas qu'il y ai de moyens faciles de trouver si un fichier est actuellement ouvert. Si un tel moyen existe, j'aurai bien aimé le connaitre ...

  3. #3
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    C'est aussi simple d'essayer de le supprimer (try/catch) et de mettre un message si la suppression n'a pas réussie non ?

    Parce que si tu vois que le fichier est ouvert, que vas-tu faire si ce n'est mettre un message ?

    Edit : grilled par smyley.

    Sinon smyley, je pense que si tu tentes de créer un FileStream, sur le fichier dont tu veux tester l'ouverture, avec FileShare.None en option ca devrait te lever une exception si le fichier est déjà ouvert, enfin il me semble car je n'ai pas de quoi tester sous la main ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try
    {
        FileStream stream = new FileStream(filePathName, FileMode.Open, FileAccess.Read, FileShare.None);
    }
    catch(Exception ex)
    {
        ...
    }

  4. #4
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 105
    Points : 90
    Points
    90
    Par défaut
    je vasi tester vos 2 propositions.

    mais à vrai dire j'ai fouiller sur tous les forums et y a beaucoup de gens qui veulent savoir si existe-elle une tell eméthode

  5. #5
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Non à vrai dire avec l'exception tu sais qu'il y a eu une erreur lors de l'accès au fichier. Il est peut être ouvert, peut être qu'il n'existe pas, peut être que l'accès a été refusé, peut être que le disque de destination n'est plus accessible, etc etc...
    Ce que j'ai recherche c'est plus un moyen d'avoir la certitude que le fichier est véritablement ouvert par une autre application, et savoir quelle application ...

  6. #6
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    C'est sûr que suivant les cas possibles, le contexte qui gravite autour, ... pas mal de choses peuvent influer et ouvrir en FileShare.None peut ne pas suffir. Dans un cadre moins "strict", cela peut suffir. Par contre ca ne dit pas quel processus a le fichier.

    Je crois qu'il existe un utilitaire en ligne de commande ("Open handle" ou un truc du genre, c'est avec un truc pour Windows XP de mémoire) qui renvoie les process utilisant un fichier donné en paramètre de l'utilitaire, avec une redirection c'est vite fait d'avoir ca dans un fichier texte. Maintenant le fichier est-il facilement traitable c'est autre chose.

    Parce que sinon pour faire ca en C# je ne suis pas sûr que cela soit possible. Je ne suis pas spécialiste des WMI, mais il y a peut être des choses intéressantes de ce côté ? Enfin si l'utilisation des WMI est possible dans le cadre en question ^^

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 105
    Points : 90
    Points
    90
    Par défaut
    waw ça comence à chauffer entre les géants de l'informatique,

    y a des choses intéressante dans ces 2 dernières réponses.

    je penche dessus tt de suite

  8. #8
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Je crois qu'il existe un utilitaire en ligne de commande ("Open handle" ou un truc du genre, c'est avec un truc pour Windows XP de mémoire) qui renvoie les process utilisant un fichier donné en paramètre de l'utilitaire, avec une redirection c'est vite fait d'avoir ca dans un fichier texte. Maintenant le fichier est-il facilement traitable c'est autre chose.
    http://www.developpez.net/forums/sho...d.php?t=423998
    Le truc c'est que l'histoire de dépendre d'une autre application ne me plaisait pas, justement, j'aurai préféré une petite dll native mais apparament ça n'existe pas ( du moin, pas que je sache ... ). On sais jamais si l'exe va démarrer et tout ( d'ailleurs, j'ai un problème sur mon projet actuel ou mon programme de suppression semble ne pas démarrer ... ).
    L'autre solution sera d'aller utiliser l'api native de Windows mais ça doit être du des choses qui change le plus d'une version à l'autre et donc tout ce que j'avais trouvé dessus indiquait que ces fonctions pourraient être supprimées dans les prochaines versions de Windows ...

    Citation Envoyé par StormimOn Voir le message
    Je ne suis pas spécialiste des WMI, mais il y a peut être des choses intéressantes de ce côté ? Enfin si l'utilisation des WMI est possible dans le cadre en question ^^
    ça semble plus faisable ça mais moi non plus je m'y connais pas en WMI ( y a t il un connaisseur ici ? )

    Citation Envoyé par killer69 Voir le message
    waw ça comence à chauffer entre les géants de l'informatique

    Ceci dit pour en revenir à ton problème je pense que tu n'aura pas besoin de tant de complication ...

  9. #9
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par smyley Voir le message
    Non à vrai dire avec l'exception tu sais qu'il y a eu une erreur lors de l'accès au fichier. Il est peut être ouvert, peut être qu'il n'existe pas, peut être que l'accès a été refusé, peut être que le disque de destination n'est plus accessible, etc etc...
    Pas du tout !

    Si on utilise le File.Delete (ns System.IO)

    - il n'y a pas d'exception si le fichier n'existe pas
    - les exceptions en cas de fichier en utilisation ou de problème d'autorisation, de directory inexistant, etc .. sont différentes.

    Ce que j'ai recherche c'est plus un moyen d'avoir la certitude que le fichier est véritablement ouvert par une autre application, et savoir quelle application ...
    Tu l'as : IOException.

    Il suffit de ne pas filtrer les autres cas. cf MSDN

  10. #10
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Sinon je crois que c'est possible de détecter l'utilisation d'un fichier par une autre application sans passer par les exceptions.
    EN fait je n'en suis pas réellement sur, mais je viens de penser à quelque chose.

    Dernièrement en VBS j'ouvre un fichier excel pour faire des trucs. Ce même fichier est déjà ouvert par moi même pour voir ce qu'il contient.
    Bref tout ceci pour dire que si vous ouvrez un fichier excel et qu'autre chose ou quelqu'un d'autre l'ouvre sur le même poste, alors il ne l'ouvrira qu'en lecture seul. On peut observer ce comportement en fermant le fichier read/write, et alors excel vous propose de passer l'autre instance d'excel en R/W sur le fichier et non Read only.

    Bref ce que propose excel est certainement lié à excel lui même. Mais le fait que la deuxième instance d'excel ne puisse ouvrir le fichier qu'en lecture seul, je en suis pas sur que cela soit un comportement d'excel, je pencherais pour un comportement de windows.

    Donc l'idée dans notre cas serait d'ouvrir le fichier, et de vérifier si les droits pour cette instance sont ReadOnly ou Read/Write.

    En WMI, hum avec cette methode de l'objet CIM_DataFile peut être.

    Mais la propriété InUseCount de CIM_LogicalFile semble mieux convenir :
    InUseCount
    Data type: uint64
    Access type: Read-only

    Number of "file opens" that are currently active against the file.

  11. #11
    Membre du Club Avatar de clodo13
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 67
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par ced600 Voir le message
    Sinon je crois que c'est possible de détecter l'utilisation d'un fichier par une autre application sans passer par les exceptions.
    EN fait je n'en suis pas réellement sur, mais je viens de penser à quelque chose.

    Dernièrement en VBS j'ouvre un fichier excel pour faire des trucs. Ce même fichier est déjà ouvert par moi même pour voir ce qu'il contient.
    Bref tout ceci pour dire que si vous ouvrez un fichier excel et qu'autre chose ou quelqu'un d'autre l'ouvre sur le même poste, alors il ne l'ouvrira qu'en lecture seul. On peut observer ce comportement en fermant le fichier read/write, et alors excel vous propose de passer l'autre instance d'excel en R/W sur le fichier et non Read only.

    Bref ce que propose excel est certainement lié à excel lui même. Mais le fait que la deuxième instance d'excel ne puisse ouvrir le fichier qu'en lecture seul, je en suis pas sur que cela soit un comportement d'excel, je pencherais pour un comportement de windows.

    Donc l'idée dans notre cas serait d'ouvrir le fichier, et de vérifier si les droits pour cette instance sont ReadOnly ou Read/Write.

    En WMI, hum avec cette methode de l'objet CIM_DataFile peut être.

    Mais la propriété InUseCount de CIM_LogicalFile semble mieux convenir :

    Je te confirme ce soir mais j'ai déja pensé a sa ! et je crois que sa fonctionne pas :!

  12. #12
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Pas du tout !

    Si on utilise le File.Delete (ns System.IO)
    ouai ... sauf qu'on parlais du FileStream là ...

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

Discussions similaires

  1. Comment vérifier qu'un fichier est déjà ouvert ?
    Par n@n¤u dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 04/08/2011, 12h23
  2. Comment vérifier si un fichier est corrompu
    Par julien_974 dans le forum C#
    Réponses: 6
    Dernier message: 24/08/2010, 18h27
  3. [WD14] Vérifier si un fichier est ouvert dans une autre application
    Par Gaautman dans le forum WinDev
    Réponses: 1
    Dernier message: 17/01/2010, 20h07
  4. Réponses: 8
    Dernier message: 28/03/2006, 08h04
  5. Unix - Comment savoir si un fichier est ouvert
    Par freddyboy dans le forum C
    Réponses: 7
    Dernier message: 06/10/2004, 15h53

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