grosbidou21
Messages postés74Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention 5 février 2010
-
9 nov. 2006 à 08:24
grosbidou21
Messages postés74Date d'inscriptionmardi 3 février 2004StatutMembreDerniè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...
grosbidou21
Messages postés74Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention 5 février 20102 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...
cboulas
Messages postés2641Date d'inscriptionmercredi 2 juin 2004StatutMembreDernière intervention 8 janvier 201416 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
grosbidou21
Messages postés74Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention 5 février 20102 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...
Vous n’avez pas trouvé la réponse que vous recherchez ?
cboulas
Messages postés2641Date d'inscriptionmercredi 2 juin 2004StatutMembreDernière intervention 8 janvier 201416 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.
grosbidou21
Messages postés74Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention 5 février 20102 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...
cboulas
Messages postés2641Date d'inscriptionmercredi 2 juin 2004StatutMembreDernière intervention 8 janvier 201416 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
grosbidou21
Messages postés74Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention 5 février 20102 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...
cboulas
Messages postés2641Date d'inscriptionmercredi 2 juin 2004StatutMembreDernière intervention 8 janvier 201416 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.
grosbidou21
Messages postés74Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention 5 février 20102 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...
cboulas
Messages postés2641Date d'inscriptionmercredi 2 juin 2004StatutMembreDernière intervention 8 janvier 201416 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
grosbidou21
Messages postés74Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention 5 février 20102 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...
ShareVB
Messages postés2676Date d'inscriptionvendredi 28 juin 2002StatutMembreDernière intervention13 janvier 201626 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....
grosbidou21
Messages postés74Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention 5 février 20102 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...
grosbidou21
Messages postés74Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention 5 février 20102 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...