IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau .NET Discussion :

FTP : Télécharger un fichier dont le nom contient un anti-slash ?


Sujet :

Réseau .NET

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut FTP : Télécharger un fichier dont le nom contient un anti-slash ?
    Bonjour,

    Je suis en train de travailler sur un programme qui permet de télécharger des fichiers depuis un serveur FTP.

    Je suis parti d'exemples basiques trouvés dans la documentation de Microsoft.

    Voici mon code actuel :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    using System;
    using System.IO;
    using System.Net;
    using System.Collections.Generic;
    using System.Text;
     
    namespace FtpClient
    {
        public class cFtpClient
        {
            public Uri Address { get; set; }
            public string Login { get; set; }
            public string Password { get; set; }
     
     
            public string[] List()
            {
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(Address);
                request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
                request.Credentials = new NetworkCredential(Login, Password);
                request.UsePassive = true;
                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
                Stream responseStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(responseStream);
                string[] ret = reader.ReadToEnd().Split('\n');
                List<string> res = new List<string>();
     
                for (int i = 0, cpt = ret.Length; i < cpt; i++)
                {
                    if (ret[i].Length > 67)
                    {
                        res.Add(ret[i].Substring(67).Trim());
                    }
                }
     
                reader.Close();
                return res.ToArray();
            }
     
            public void Download(string file, string place)
            {
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(string.Format("{0}/{1}", Address.AbsoluteUri, file));
                request.Method = WebRequestMethods.Ftp.DownloadFile;
                request.UseBinary = true;
                request.Credentials = new NetworkCredential(Login, Password);
                request.UsePassive = true;
                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
                Stream responseStream = response.GetResponseStream();
                FileStream writer = File.Create(string.Format("{0}{1}", place, file.Replace('\\', '_').Replace('/', '_').Replace('*', '_').Replace(':', '_').Replace('?', '_').Replace('"', '_').Replace('<', '_').Replace('>', '_').Replace('|', '_')));
     
                byte[] chunk = new byte[4096];
                int bytesRead;
                while ((bytesRead = responseStream.Read(chunk, 0, chunk.Length)) > 0)
                {
                    writer.Write(chunk, 0, bytesRead);
                }
     
                writer.Close();
            }
        }
    }

    Les fichiers sont des fichiers de toute petite taille (moins de 1 Ko), au format texte, mais avec un encodage qui m'échappe. Télécharger les fichier en binaire a été la seule méthode que j'ai trouvé pour ne pas les altérer.

    Le problème se situe avec des fichiers contenant des caractères interdit sous Windows.
    Exemple ci-dessous d'une fenêtre de FileZilla contenant un tel fichier :



    J'obtiens alors l'erreur ci-dessous :
    Le serveur distant a retourné une erreur*: (550) Fichier non disponible (par exemple, fichier introuvable, accès impossible).
    Pourtant, FileZilla arrive à télécharger le fichier, donc c'est qu'il y a bien moyen de le récupérer...

    Mais comment ?

    Le problème vient de cette ligne :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(string.Format("{0}/{1}", Address.AbsoluteUri, file));
    La variable "file" contient "1372941762-N\'GUYEN.csv"
    Je ne sais pas par quoi remplacer cet anti-slash pour que le serveur FTP l'accepte...

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    La variable "file" contient "1372941762-N\'GUYEN.csv"
    Je ne sais pas par quoi remplacer cet anti-slash pour que le serveur FTP l'accepte...
    Essaye de doubler le backslash : "1372941762-N\\'GUYEN.csv"

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    En fait, la solution m'est venue dans la nuit.

    Vu que je passe à l'objet une URI pour le chemin d'accès au fichier...
    Il faudrait déjà commencer par faire un UrlEncode sur le nom du fichier !

    Problème résolu

    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(string.Format("{0}/{1}", Address.AbsoluteUri, WebUtility.UrlEncode(file)));

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 04/11/2010, 13h28
  2. Réponses: 1
    Dernier message: 06/09/2010, 17h48
  3. Ouvrir fichier dont le nom contient des parenthèses
    Par Alphonse87 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 26/03/2010, 09h35
  4. Réponses: 3
    Dernier message: 05/12/2008, 23h14
  5. comment télécharger fichier dont le nom contient &
    Par issaivo dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 29/12/2006, 23h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo