Comment déterminer si un fichier est utilisé par un processus?

cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 - 21 mai 2008 à 15:32
 ShareVB - 7 juil. 2008 à 19:51
Salut,

Tout est dans le titre

Merci d'avance

*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***

22 réponses

jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
21 mai 2008 à 16:31
Salut,

Je ne connais pas la solution, mais voici une code qui pourra t'aider sur la detection des fichiers ouverts, et par qui!

http://www.vbfrance.com/codes/FERMER-FICHIER-OUVERT-AUTRE-APPLICATION_35142.aspx

Jimy
0
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
21 mai 2008 à 18:38
Salut,

ça a l'air bien^^, mais c'est du VB6, j'ai essayé de le faire bouffer par VS (qui a essayé de le convertir) mais ça me fait un truc horrible. Je vais essayer d'arranger ça, si vous avez autre chose, c'est avec plaisir

++

*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***
0
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
22 mai 2008 à 11:20
Salut,

ça ne fonctionne pas, j'ai du faire plusieurs erreur en corrigeant les bug et ça ne donne rien. Par contre:
vous savez tous que quand on veux supprimé un fichier et qu'il est utilisé pas un programme, on a un message d'erreur. Comment puis-je faire pour ne pas avoir ce message d'erreur, et que je gère moi-même cet erreur?

*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
25 mai 2008 à 16:05
Salut,

Voici un bout de code qui pourrait t'aiguiller :

Try
            My.Computer.FileSystem.DeleteFile("C:\Test.doc")
Catch ex As Exception
            MsgBox("Le fichier ne peut pas être supprimé")
End Try

Petite explication :

Il faut mettre entre Try et Catch, le code que tu veux surveiller ou qui est susceptible d'obtenir un message d'erreur. C'est le cas ici pour : My.Computer.FileSystem.DeleteFile("C:\Test.doc").

Entre Catch et End Try, il faut mettre le code pour gérer toi même cette erreur, par exemple, moi je fais afficher un message spécifiant que le fichier n'a pas pu être supprimé.

Après je sais pas si tu spécifies directement le chemin d'accès + le nom du fichier ou alors c'est une boucle qui parcoure tous les fichiers d'un dossier (je penses que c'est ce cas là que tu utilises). Dans le 1° cas, faudra tester au préalable si le fichier existe.

++

Si tu as des soucis, n'hésites pas

----------------------------------------
N'oubliez pas : Réponse Acceptée
0

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

Posez votre question
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
25 mai 2008 à 17:26
Salut,

j'ai déja essayé ça, et, j'ai toujours le message d'erreur de Windows, plus, celui de mon code.

*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
25 mai 2008 à 21:11
Salut,

Tu es sûr car avec ce code j'ai publié mon projet puis installé mon programme.

Je lances le fichier Test.doc pour que le processus winword.exe l'utilise et je lances ensuite mon programme et j'ai bien mon message d'erreur qui apparait mais Windows ne fait rien, ce qui est normal c'est à cà que sert Try Catch

Je vois pas pas pourquoi Windows intervient !!! Tu peux mettre ton code pour que je jette un coup d'oeil ?

Merci
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
25 mai 2008 à 21:11
Salut,

Tu es sûr car avec ce code j'ai publié mon projet puis installé mon programme.

Je lances le fichier Test.doc pour que le processus winword.exe l'utilise et je lances ensuite mon programme et j'ai bien mon message d'erreur qui apparait mais Windows ne fait rien, ce qui est normal c'est à cà que sert Try Catch

Je vois pas pas pourquoi Windows intervient !!! Tu peux mettre ton code pour que je jette un coup d'oeil ?

Merci
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
25 mai 2008 à 21:13
Oups !

Désolé pour le double post, j'ai pourtant posté qu'une seule fois mon message et je n'ai pas fait Précédent avec mon navigateur
0
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
25 mai 2008 à 21:25
Salut, voila mon code:

 For i = 0 To ListView1.Items.Count - 1 ' Boucle sur le nombre d'items dans la ListView
            For j = 0 To ListView1.Columns.Count - 1 ' Boucle sur le nombre de colonnes dans la ListView
                If Me.ListView1.Items(i).Checked = True Then
                    Try
                        My.Computer.FileSystem.DeleteFile(ListView1.Items(i).SubItems(2).Text, FileIO.RecycleOption.DeletePermanently, FileIO.UICancelOption.DoNothing)
                        Me.ListView1.Items(i).Remove()
                    Catch
                        Try
                            My.Computer.FileSystem.DeleteDirectory(ListView1.Items(i).SubItems(2).Text, FileIO.RecycleOption.DeletePermanently, FileIO.UICancelOption.DoNothing)
                            Me.ListView1.Items(i).Remove()
                        Catch
                            Me.ListView1.Items(i).Checked = False
                        End Try
                    End Try
                End If
            Next j
        Next i

En gros, ici, si un Item de ListView1 est coché, on supprime le fichier ou dossier ayant pour nom la valeur de l'item...
Si on arrive pas à supprimer le fichier, on essaie de le supprimer en disant que c'est un dossier, et si ça fonctionne toujours pas (parce qu'il est utiliser par un processus par exemple), on décoche l'item (ou on affiche un msg d'erreur par exemple).

Voila, donc pour conclure, j'ai la case qui se décoche, ET le message de Windaube.

*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
25 mai 2008 à 21:35
Essaies plutôt cà :

 For i = 0 To ListView1.Items.Count - 1 ' Boucle sur le nombre d'items dans la ListView
            For j = 0 To ListView1.Columns.Count - 1 ' Boucle sur le nombre de colonnes dans la ListView
                If Me.ListView1.Items(i).Checked = True Then
                    Try
                        If My.Computer.FileSystem.FileExists(ListView1.Items(i).SubItems(2).Text) = True Then ' On teste si l'item sélectionné est un fichier
                            My.Computer.FileSystem.DeleteFile(ListView1.Items(i).SubItems(2).Text, FileIO.RecycleOption.DeletePermanently, FileIO.UICancelOption.DoNothing) ' Si oui, on le supprime
                            Me.ListView1.Items(i).Remove()
                        Else ' Sinon c'est un dossier
                            My.Computer.FileSystem.DeleteDirectory(ListView1.Items(i).SubItems(2).Text, FileIO.RecycleOption.DeletePermanently, FileIO.UICancelOption.DoNothing)
                            Me.ListView1.Items(i).Remove()
                        End If
                    Catch
                        Me.ListView1.Items(i).Checked = False
                    End Try
                End If
            Next j
        Next i
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
25 mai 2008 à 21:37
On vire ainsi un Try Catch
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
25 mai 2008 à 21:46
Par contre, ton code va rencontrer une erreur si tu supprimes le dernier item de ListView1

En effet, imaginons que ta Listview à 5 items : la variable i va aller de 0 à 4.

Tu coches le dernier item, donc c'est quand i sera égal à 4 que ton code va supprimer cet item

Malheureusement, après avoir supprimer cet item, il t'en restera plus que 4 items (de 0 à 3) mais la variable i, elle sera toujours à 4 donc ta ligne de code Me.ListView1.Items(i).Checked = False  va tomber sur un item inexistant ce qui va produire une erreur
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
25 mai 2008 à 21:52
pour faire plus simple :

5 items : (item n°4 coché donc i = 4 quand l'item sera supprimé)

index

(0)                 ----------------------------------
(1)                 ----------------------------------
(2)                 ----------------------------------
(3)                 ----------------------------------
(4)                 ---------------------------------- (*)

Après la suppression de l'item :

index


(0)                 ----------------------------------

(1)                 ----------------------------------

(2)                 ----------------------------------

(3)                 ----------------------------------
                                                                           (*) i est toujours égal à 4 donc erreur avec la ligne de code Me.ListView1.Items(i).Checked = False puisque l'item n°4 n'existe plus
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
25 mai 2008 à 21:57
Ne tiens pas compte de l'erreur que j'ai trouvé... ca fonctionnera très bien, dans mon Visual Studio, la ligne de code

Me.ListView1.Items(i).Checked = False

était avant Catch

Désolé
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
25 mai 2008 à 21:58
Ne tiens pas compte de l'erreur que j'ai trouvé... ca fonctionnera très bien, dans mon Visual Studio, la ligne de code

Me.ListView1.Items(i).Checked = False

était avant Catch

Désolé
0
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
25 mai 2008 à 22:14
Salut,

Oui, je me disais aussi, je ne comprenais pas pourquoi j'aurais une erreur ici alors que ça fonctionne très bien avec d'autre code ce style.
Par contre, le code que tu m'as proposé ne change rien, j'ai toujours le même problème.

Les fichiers devant être supprimé se trouve dans Prefetch, Temp et autre dossier de Windows dans lequel on trouve des fichiers inutile... Peu être que l'erreur est provoqué par le fait que ça viens de ce genre de dossier?

Bon, sinon, je ne vois vraiment pas d'où peux venir ce problème

*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
26 mai 2008 à 14:28
Salut,

As tu essayé d'effacer un fichier dans un autre endroit, par exemple, à la racine de C:\ ?

Moi j'ai essayé d'effacer un fichier dans Prefetch aucun problème, tu peux mettre tout ton code ?

Peut être il y a une erreur quelque part (qui n'empêche pas le programme de fonctionner) mais qui altère le fonctionnement de Try Catch

J'ai jamais eu de problème avec le Try Catch
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
26 mai 2008 à 14:37
Ou encore mieux, envois moi tout ton projet je pourrais voir si ca fait la même chose de mon coté...
0
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
26 mai 2008 à 17:43
Pour le moment tout le code est là:

 Dim i As Integer

        For i = 0 To ListView1.Items.Count  ' Boucle sur le nombre de colonnes dans la ListView
            If Me.ListView1.Items(i).Checked = True Then
                Try
                    If My.Computer.FileSystem.FileExists(ListView1.Items(i).SubItems(2).Text) = True Then ' On teste si l'item sélectionné est un fichier
                        My.Computer.FileSystem.DeleteFile(ListView1.Items(i).SubItems(2).Text, FileIO.RecycleOption.DeletePermanently, FileIO.UICancelOption.DoNothing) ' Si oui, on le supprime
                        Me.ListView1.Items(i).Remove()
                    Else ' Sinon c'est un dossier
                        My.Computer.FileSystem.DeleteDirectory(ListView1.Items(i).SubItems(2).Text, FileIO.RecycleOption.DeletePermanently, FileIO.UICancelOption.DoNothing)
                        Me.ListView1.Items(i).Remove()
                    End If
                Catch
                    Me.ListView1.Items(i).Checked = False
                End Try
            End If
        Next i

Il n'y a rien d'autre car je développe des fonctions sous un projet temporaire consacré à celà (pour éviter justement les éventuelles bug que peuvent provoquer les autres fonctions)

Voila, je continue à cherche de mon côté, mais tout comme toi, sans résulat positif

*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***
0
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
3 juin 2008 à 09:09
Up!

Je ne trouve toujours rien

*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***
0
Rejoignez-nous