Partage
  • Partager sur Facebook
  • Partager sur Twitter

[FTP] UploadDirectory

    5 août 2018 à 13:28:08

    Bonjour;

    Je n'arrive pas à trouver une solution pour upload un dossier sur mon serveur FTP. J'utilise un backgroundworker sous wpf cependant, lorsque je démarre le debogage j'ai cette exception : "System.IO.IOException : 'Le processus ne peut pas accéder au fichier 'C:\Users\Soap\Desktop\Client\Client2.x - Copie (10).txt', car il est en cours d'utilisation par un autre processus." Elle est levée sur la ligne 21.

    Voici le code, je ne suis même pas sur si le code pour l'uploading du dossier est correct : 

            public UpdatePanelModelView(UpdatePanel updatePanelWindow)
            {
                this.m_updatePanelWindow = updatePanelWindow;
                this.UpdateCommand = new CommandHelper(this.OpenFileDialog);
                this.m_backgroundWorker = new BackgroundWorker();
                this.m_backgroundWorker.DoWork += this.BackgroundWorker_DoWork;
                this.m_backgroundWorker.ProgressChanged += this.BackgroundWorker_ProgressChanged;
                this.m_backgroundWorker.RunWorkerCompleted += this.BackgroundWorker_RunWorkerCompleted;
                this.m_backgroundWorker.WorkerReportsProgress = true;
            }
    
            private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
            {
                foreach(string file in Directory.GetFiles((string)e.Argument))
                { 
                WebRequest request = WebRequest.Create(new Uri(string.Format("{0}/{1}", Constants.FTTP_SERVER, Path.GetFileName(file)))) as FtpWebRequest;
                request.Method = WebRequestMethods.Ftp.UploadFile;
                request.Credentials = new NetworkCredential(Constants.FTTP_USER_NAME, Constants.FTTP_PASSWORD);
                    using (Stream ftpStream = request.GetRequestStream())
                    {
                        using (FileStream fStream = File.OpenRead(file))
                        {
                            byte[] buffer = new byte[fStream.Length];
                            int byteRead = 0;
                            double read = 0;
                            do
                            {
                                byteRead = fStream.Read(buffer, 0, buffer.Length);
                                ftpStream.Write(buffer, 0, byteRead);
                                read += (double)byteRead;
                                this.m_backgroundWorker.ReportProgress((int)(read / fStream.Length * 100));
                            } while (byteRead != 0);
                            ftpStream.Close();
                            fStream.Close();
                        }
                    }
                }
            }
    
            private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                Debug.WriteLine(e.ProgressPercentage);
            }
            private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                MessageBox.Show("Finish");
            }
            private void OpenFileDialog(object parameter)
            {
                var updateButtonContent = this.m_updatePanelWindow.UpdateButton.Content;
                switch (updateButtonContent.ToString())
                {
                    case "Parcourir...":
                        WinForms.FolderBrowserDialog folderBrowserDialog = new WinForms.FolderBrowserDialog
                        {
                            RootFolder = Environment.SpecialFolder.Desktop,
                            Description = "Veuillez sélectionner le dossier de mise à jours.",
                            ShowNewFolderButton = false
                        };
                        if (folderBrowserDialog.ShowDialog() == WinForms.DialogResult.OK)
                            this.m_updateFile = folderBrowserDialog.SelectedPath;
                        this.m_updatePanelWindow.UpdateButton.Content = "Update";
                        break;
                    case "Update":
                        this.m_backgroundWorker.RunWorkerAsync(this.m_updateFile);
                        this.m_updatePanelWindow.UpdateButton.Content = "Parcourir...";
                        break;
                }
            }
        

    s'il y'a un autre moyen plus simple ou moins chronophage pour upload un dossier sur un serveur FTP en ne passant pas par un BackgroundWorker je suis prenant.

    -
    Edité par Perosuperō 5 août 2018 à 14:11:29

    • Partager sur Facebook
    • Partager sur Twitter
      6 août 2018 à 22:15:24

      Soit c'est votre propre application qui verrouille le fichier (non utilisation d'un "using") soit il s'agit d'une autre application.

      Si c'est votre application, corrigez là pour ne pas verrouiller inutilement le fichier.

      Si c'est une autre applcation, catchez l'exception IOException et temporisez la lecture pour laisser l'application le temps de déverrouiller le fichier qu'il doit être en train de modifier.

      Pour savoir quelle application verrouille un fichier, utilisez ProcessExplorer.

      https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        7 août 2018 à 22:59:30

        Bonsoir,

        Merci pour l'aide, finalement je suis passé par un Web Client. C'est aussi bien et je préfère l'asynchronisme pour cette tache que le threadisme finalement :D

        • Partager sur Facebook
        • Partager sur Twitter
          7 août 2018 à 23:06:49

          Pas trop de limitations au niveau sécurité ???
          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            12 août 2018 à 12:05:01

            bacelar a écrit:

            Pas trop de limitations au niveau sécurité ???

            C'est-à-dire ?

            • Partager sur Facebook
            • Partager sur Twitter
              12 août 2018 à 16:19:00

              Généralement, les applications Web n'ont pas accès à tout le système de fichier de la machine cliente.
              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

              [FTP] UploadDirectory

              × 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