Supprimer un fichier utilisé

grosbidou21 Messages postés 74 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 5 février 2010 - 9 nov. 2006 à 08:24
grosbidou21 Messages postés 74 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 5 février 2010 - 13 nov. 2006 à 10:53
Bonjour à tous,
J'ai un soucis! mon programme supprime des fichiers dans une boucle de la manière :

        Dim FICHIER As String
        Dim CHEMIN As String    'Le chemin est défini

        For Each FICHIER In System.IO.Directory.GetFiles(CHEMIN)
            Try
                Kill(FICHIER)
            Catch ex As Exception
                'Création d'une liste des fichiers non supprimés
            End Try
        Next

Le problème qui se passe est que certains fichiers sont utilisés soit par mon programme, soit par l'explorer. En effet, il s'agit de fichiers image que je charge dans une imagelist auparavant. Mais pourtant j'utilise bien la propriété "image.dispose" mais certaines sont récalcitrantes...
Existe-t-il un code, une Api ou autre qui pourrait libérer ces fichiers et me permettre de les supprimer?
Merci d'avance!
Alain

La programation c'est au moins autant prise de tête que ... je ne vois pas rien ne l'égale...

18 réponses

drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
9 nov. 2006 à 08:42
Salut essaie d'insérer se code dans ta boucle

Dim FICHIER As String
        Dim CHEMIN As String    'Le chemin est défini

        For Each FICHIER In System.IO.Directory.GetFiles(CHEMIN)
            Try

If not nothing(fichier) then

fichier.close
ou
fichier.dispose

End if
                Kill(FICHIER)
            Catch ex As Exception
                'Création d'une liste des fichiers non supprimés
            End Try
        Next

 Drikce 06
0
grosbidou21 Messages postés 74 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 5 février 2010 2
9 nov. 2006 à 09:16
Merci pour ta réponse mais il y'a quelque chose que je ne comprend pas :
 Fichier est déclaré en tant que String car le system.io.directory.getfiles() renvoie un tableau de string.
Comme, à partir de cette variable on pourrait écrire fichier.close ? Il me marque évidement que "Close n'est pas un membre de string"

Par contre tu m'as fait penser à regardé le filesystemobject que je n'utilise plus depuis un moment car le framework prend en charge pas mal de chose, mais j'ai qd même trouvé quelque chose d'interressant :
(Pour utiliser le filesystem object, il faut importer la référence "Microsoft.scripting")

        Dim FICHIER As String
        Dim CHEMIN As String
        Dim FIC As Scripting.File
        Dim fso As New Scripting.FileSystemObject

        For Each FICHIER In System.IO.Directory.GetFiles(CHEMIN)
            Try
                FIC = fso.GetFile(FICHIER)
                FIC.Delete(True)         'ICI le True permet de "Forcer" la suppression du fichier
                'Kill(FICHIER)
            Catch ex As Exception

            End Try
        Next

Quelqu'un as-t-il des infos sur cette fonction du FSO? Des tests déjà faits?

La programation c'est au moins autant prise de tête que ... je ne vois pas rien ne l'égale...
0
cboulas Messages postés 2641 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 8 janvier 2014 16
9 nov. 2006 à 12:02
Salut, si tu veux pouvoir les supprimés il faut qu'il ne soit plus utiliser ou que tu fasse sauter la réservation.
après pour la suppréssion cela tiens en 1 seule et unique ligne !!!

system.io.file.delete(PathDuFichier)


après si tu veux gérer les erreurs lors de la suppression fait comme ceci :

        Dim FICHIER As String
        Dim CHEMIN As String
        Dim FIC As Scripting.File
        Dim fso As New Scripting.FileSystemObject

        For Each FICHIER In System.IO.Directory.GetFiles(CHEMIN)
            Try
               system.io.file.delete(PathDuFichier)   'ainsi à la moindre erreur lors de la suppression tu passe au fichier suivant
            Catch : End Try
        Next



Chris...


Web :
Firstruner
0
grosbidou21 Messages postés 74 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 5 février 2010 2
9 nov. 2006 à 12:32
Salut,
Merci pour la réponse.

En ce qui concerne le system.io.file.delete(fichier), je pense que ça équivaut au kill(fichier) ou encore au FIC.delete (quand FIC est de type scripting.file ou je me trompe?

Maintenant qu'est ce que tu veux dire par "faire sauter la réservation"? Le fichier était utilisé par mon programme mais je l'ai déchargé en appliquant la méthode "image.dispose" (les fichiers sont des images chargées dans une imagelist)
Mais j'aimerai connaitre la manière dont je pourrai faire "sauter toutes les réservations qu'il y a sur ce fichier! Y comprit la possibilité que ce soit l'explorer qui utilise ce fichier...

La programation c'est au moins autant prise de tête que ... je ne vois pas rien ne l'égale...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cboulas Messages postés 2641 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 8 janvier 2014 16
9 nov. 2006 à 12:51
lorsque tu appel Kill tu utilise une bibliotèque de microsoft.visualbasic qui fonctionne en doublons donc chargée 2 fois dans le système: la cause :
toutes les fonctions microsoft.visualbasic sont trouvable différement dans : system ...
En ce qui concerne scripting.file ce n'est pas une mauvaise idée de l'utiliser pour gérer l'effacement automatique sans l'avis de l'O.S., la cause : Kernel gère une partie de l'O.S. mais le Framework prend le dessus, qd je dis faire qauter la réservation c'est simple lorsque tu ouvre un fichier son handle de fichier est stocké en RAM, le Kernel le gère, le framework aussi mais il faut attendre Vista, bref donc pour faire sauter la résa il faut retrouver son Handle et le supprimer ainsi ton fichier redeviens ré-ouvrable. cela ne marche pas avec note pad par exemple car une fois le fichier ouvert, il rend la résa d'où le fait que tu l'ouvre 28 fois si tu le veux ^^ et même plus. Le Scripting.File : il faudrait juste vérifier que celui-ci ne charge pas trop de chose en RAM car sinon tu va charger 20Ko d'un objet alors qu'avec system.io.file tu n'en utilisera peut-être pas autant. tout dépend l'utilisation que tu as du scripting.file.


P.S. : Faire sauter la résa, c'est pas simple car si tu te plante : tu plante kernel, malheureusement XP en a encore besoin pour les 10 à 20% qu'il l'utilise encore.



Chris...


Web :
Firstruner
0
grosbidou21 Messages postés 74 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 5 février 2010 2
9 nov. 2006 à 13:11
Merci beaucoup pour ces précisions.
J'ai mieux compris les nuances qu'il y avait entre chaque mais j'avoue que c'est pas évident! Heureusement qu'il y a des personnes comme toi qui sont là pour expliquer tout ça
Malgré tout il y a un point qui reste assez mystérieux pour moi : "pour faire sauter la résa il faut retrouver son Handle et le supprimer"
Comment trouver son Handle? Et comment le supprimer?!

La programation c'est au moins autant prise de tête que ... je ne vois pas rien ne l'égale...
0
cboulas Messages postés 2641 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 8 janvier 2014 16
9 nov. 2006 à 13:15
La question est surtout un Handle, un handle c'est une référence à un fichier ou affichage graphique ou autres... je savais le faire en VB6 mais il fausrait que je recherche comment faire ça en .Net

Chris...
Web : Firstruner
0
grosbidou21 Messages postés 74 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 5 février 2010 2
9 nov. 2006 à 13:51
Merci Chris t'es un chef !
Je vais aussi essayer de trouver quelque chose de mon côté
@+

La programation c'est au moins autant prise de tête que ... je ne vois pas rien ne l'égale...
0
grosbidou21 Messages postés 74 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 5 février 2010 2
9 nov. 2006 à 14:43
J'ai trouvé une chose qui apparement réglerait le problème!

Avant de lancer ma boucle qui exécute la suppression des fichiers, je rajoute la ligne "GC.Collect"
Ce qui donne :

        Dim FICHIER As String
        Dim CHEMIN As String

        GC.Collect()
        For Each FICHIER In System.IO.Directory.GetFiles(CHEMIN)
            Try
               system.io.file.delete(FICHIER) 
            Catch : End Try
        Next

Pour être totalement franc, j'ai trouvé cette méthode sur le net mais je ne sais pas du tout ce que cela fait... Ca force un "Garbage Collection" et donc libère de la mémoire les fichiers utilisés. Ca m'a l'air un peu "bourrin" comme méthode mais ça fonctionne!
Des renseignements sur ce "GB.Collect" ??

En tout cas merci pour tout Chris alias cboulas ainsi qu'à Drikce06

La programation c'est au moins autant prise de tête que ... je ne vois pas rien ne l'égale...
0
cboulas Messages postés 2641 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 8 janvier 2014 16
9 nov. 2006 à 14:54
En fait il te faut des renseignement sur le GC :

Le GC qui se nomme : GarbageCollector est un collecteur de poubelle, ça veux dire qu'il sais par utilisation de ton soft, etc.. quel objets tu n'utilise pas ou plus, ceux-ci sont stockés à l'intérieur, le fait d'appeler le GC.Collect c'est comme si tu appelais ta mairie pour demander le passage des éboueurs afin de ne pas attendre qui se décide à le faire.
Car en gros le GC attend que le pc soit le moins utiliser (par un truc de stat) afin de faire passer la collecte et donc de gèner le moins possible l'utilisateur.


On l'utilise aussi pour les timers de services windows par exemple.



Chris...


Web :
Firstruner
0
cboulas Messages postés 2641 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 8 janvier 2014 16
9 nov. 2006 à 15:00
P.S. : Le GC y'a des livres conssacré à ce truc mais les bons livres ne font pas moins de 200 à 250 pages

Chris...
Web : Firstruner
0
grosbidou21 Messages postés 74 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 5 février 2010 2
9 nov. 2006 à 17:30
Okay je comprends mieux maintenant.
Mais peut-on utiliser ce GC.Collect régulièrement? Je ne le mettrai pas dans la boucle que ce soit bien clair! Mais il n'y a aucune risque pour quoi que ce soit?
En tout cas encore une fois merci pour ton soutien ;-)

La programation c'est au moins autant prise de tête que ... je ne vois pas rien ne l'égale...
0
cboulas Messages postés 2641 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 8 janvier 2014 16
9 nov. 2006 à 17:34
Heuuu, bhàà en général c'est rare que l'on y fait appel car le GC est un des outils les plus complexe du framwork, il y a eu plusieurs années d'études dessus afin de donnée un truc "idéal" (car l'idéal serais qu'il devine un peu plus souvent tout seul ^^)
En gros non si tu doit l'appeler ce serais en sortie de boucle, mais disons que je suis pas assez calé sur le GC pour te dire vraiment sa réaction si tu l'appel 10 fois par seconde par exemple. peut-être plantage du PC ou des choses vraiment bizzare comme perte de variable dans d'autres soft .Net, à vérifier et tester

Chris...
Web : Firstruner
0
grosbidou21 Messages postés 74 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 5 février 2010 2
9 nov. 2006 à 18:20
Bon ça va alors!
Non je n'ai pas l'intention d'en faire appel 10 fois par seconde! Mais juste avant la boucle, donc rien de bien méchant.
Bonne soirée Chris, à très bientôt

La programation c'est au moins autant prise de tête que ... je ne vois pas rien ne l'égale...
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
12 nov. 2006 à 16:11
salut,

le garbage collector c'est le processus .net qui est chargé de libérer les objets pour vous...en gros tu instancies un objet en .Net et tu n'as pas à te soucier de le détruire le GC le fait pour toujours toi quand il a le temps...donc on ne peut pas savoir quand si ce n'est que c'est avant la fin du programme...GC.Collect() permet de forcer la libération des objets et donc de fermer tous les fichiers ouverts qui ne sont plus utilisés....

ShareVB
0
grosbidou21 Messages postés 74 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 5 février 2010 2
13 nov. 2006 à 09:12
Salut ShareVB,
J'ai à peu près compris ce que faisait ce GC maintenant. Par contre il libère les ressources qui ne sont plus utilisé par MON programme, donc si l'explorer utilise le fichier celui-ci ne pourra pas être libéré?
Pour plus de précision, je veux supprimer dans mon programme des images que je charge avant dans une imagelist. J'avais parfois des erreurs dûes au fait que l'imagelist ne libérer pas réellement toutes ces images. Le "GC.Collect" me sort de ce problème par contre quelques fois les images sont utilisées par l'explorer et ne peuvent donc pas non plus être supprimer. Est-ce que le GC va aussi libérer ces fichiers? Sinon quelle solutions existe-t-il?

La programation c'est au moins autant prise de tête que ... je ne vois pas rien ne l'égale...
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
13 nov. 2006 à 09:28
salut,

oui, biensûr : gc.collect() c'est uniquement pour ton programme...

si tu veux supprimer un fichier utilisé par un autre programme, il faut fermer le handle du fichier dans le processus avant...au risque de faire planter le programme en question...
enfin sinon : http://www.vbfrance.com/codes/SAVOIR-QUEL-FICHIER-EST-UTILISE-TELLE-APPLICATION-LISTE_36281.aspx...cependant, ca donne une dépendance à un driver...

ShareVB
0
grosbidou21 Messages postés 74 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 5 février 2010 2
13 nov. 2006 à 10:53
Arf c'est du .NET 2005 apparement!
Pas encore de licence pour cet outils... Ca ne saurait tardé je l'espère...
En tout cas merci pour les infos je devrais arrivé à faire quelque chose avec tout ça ;-)
Alain

La programation c'est au moins autant prise de tête que ... je ne vois pas rien ne l'égale...
0
Rejoignez-nous