Partage
  • Partager sur Facebook
  • Partager sur Twitter

Attendre la fin d'un process

Sujet résolu
    10 mai 2018 à 0:17:36

    Bonsoir à tous,

    Je cherche à comparer deux fichier XML, dont un téléchargé depuis un serveur FTP. Le problème c'est que le processus est constamment en cours d'utilisation :

    "System.IO.IOException : 'Le processus ne peut pas accéder au fichier 'C:\Users\<chemin>\bin\DebugVistalifeServeur.xml', car il est en cours d'utilisation par un autre processus.'"

    Voici mon code :

    Dim ftp As New FTP("login", "password")
            ftp.DownloadFile(Application.StartupPath & "VistalifeServeur.xml", "ftp://xx.xxx.xxx.xxx/VistalifeServeur.xml")
    
            Dim doc1 As XmlDocument = VistaLife.XmlDoc
            Dim doc2 As XmlDocument = New XmlDocument
            doc2.Load(Application.StartupPath & "VistalifeServeur.xml")

    L'erreur survient au moment de l'ouverture du document XML téléchargé. Du coup je cherche à suspendre l'exécution du programme tant que le fichier est ouvert dans un autre processus

    Une idée ?

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
    Aucune question n'est idiote, surtout quand Google n'a pas la réponse.
      11 mai 2018 à 16:24:35

      Salut,

      A part faire une boule avec un sleep qui tourne tant que tu n'as pas accès au fichier en question (avec eventuellement un nombre d'essais max ou un timeout), je vois pas trop comment faire..

      • Partager sur Facebook
      • Partager sur Twitter
      Fatalement vôtre
        15 mai 2018 à 11:53:47

        Salut,


        D.Fate a écrit:

        Salut,

        A part faire une boule avec un sleep qui tourne tant que tu n'as pas accès au fichier en question (avec eventuellement un nombre d'essais max ou un timeout), je vois pas trop comment faire..


        Faire une boule, c'est à dire ?
        • Partager sur Facebook
        • Partager sur Twitter
        Aucune question n'est idiote, surtout quand Google n'a pas la réponse.
          15 mai 2018 à 14:42:08

          La doc de cette classe "FTP" pourrait te donner la réponse sur la solution à apporter à ton problème...

          Dans le Framework classique, il y a déjà FtpWebRequest (avec un exemple assez précis sur la doc Microsoft)...Cette classe "FTP" ne semble pas être un composant du framework de base donc sans plus d'information, tu n'auras pas de réponse pertinente ici (sauf si tu tombes sur une personne qui aurait utilisé exactement le même composant que toi).

          -
          Edité par Nisnor 15 mai 2018 à 14:43:16

          • Partager sur Facebook
          • Partager sur Twitter
            19 mai 2018 à 10:31:56

            Voici la classe FTP que j'utilise :

            Public Class FTP
                '-------------------------[BroCode]--------------------------
                '----------------------------FTP-----------------------------
                Private _credentials As System.Net.NetworkCredential
                Sub New(ByVal _FTPUser As String, ByVal _FTPPass As String)
                    setCredentials(_FTPUser, _FTPPass)
                End Sub
                Public Sub DownloadFile(ByVal _FileName As String, ByVal _ftpDownloadPath As String)
                    Try
                        Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpDownloadPath)
                        _request.KeepAlive = False
                        _request.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
                        _request.Credentials = _credentials
                        Dim _response As System.Net.FtpWebResponse = _request.GetResponse()
                        Dim responseStream As System.IO.Stream = _response.GetResponseStream()
                        Dim fs As New System.IO.FileStream(_FileName, System.IO.FileMode.Create)
                        responseStream.CopyTo(fs)
                        responseStream.Close()
                        _response.Close()
                    Catch ex As Exception
                        MessageBox.Show(ex.Message, "Download Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    End Try
                End Sub
                Public Function GetDirectory(ByVal _ftpPath As String) As List(Of String)
                    Dim ret As New List(Of String)
                    Try
                        Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpPath)
                        _request.KeepAlive = False
                        _request.Method = System.Net.WebRequestMethods.Ftp.ListDirectory
                        _request.Credentials = _credentials
                        Dim _response As System.Net.FtpWebResponse = _request.GetResponse()
                        Dim responseStream As System.IO.Stream = _response.GetResponseStream()
                        Dim _reader As System.IO.StreamReader = New System.IO.StreamReader(responseStream)
                        Dim FileData As String = _reader.ReadToEnd
                        Dim Lines() As String = FileData.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
                        For Each l As String In Lines
                            ret.Add(l)
                        Next
                        _reader.Close()
                        _response.Close()
                    Catch ex As Exception
                        MessageBox.Show(ex.Message, "Directory Fetch Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    End Try
                    Return ret
                End Function
            
                Private Sub setCredentials(ByVal _FTPUser As String, ByVal _FTPPass As String)
                    _credentials = New System.Net.NetworkCredential(_FTPUser, _FTPPass)
                End Sub
            End Class



            • Partager sur Facebook
            • Partager sur Twitter
            Aucune question n'est idiote, surtout quand Google n'a pas la réponse.
              19 mai 2018 à 11:40:04

              Je ne sais pas si c'est ça, mais faudrait que tu te renseignes sur l'interface IDisposable, les classes qui l'implémentent dans ton code et le mot clef Using. Parce que mal libérer les ressources peut facilement bloquer le processus
              • Partager sur Facebook
              • Partager sur Twitter
              Censément, quelqu'un de sensé est censé s'exprimer sensément.
                23 mai 2018 à 9:46:38

                Sehnsucht a écrit:

                Je ne sais pas si c'est ça, mais faudrait que tu te renseignes sur l'interface IDisposable, les classes qui l'implémentent dans ton code et le mot clef Using. Parce que mal libérer les ressources peut facilement bloquer le processus

                Merci à toi, j'ai finalement réussi ;)
                • Partager sur Facebook
                • Partager sur Twitter
                Aucune question n'est idiote, surtout quand Google n'a pas la réponse.

                Attendre la fin d'un process

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown