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

C# Discussion :

Requête FTP sur un serveur local


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Par défaut Requête FTP sur un serveur local
    Bonjour,

    J'essaie de faire un bout de code permettant de télécharger des fichiers d'un serveur FTP du réseau local.

    Ma première requête permettant de lister les fichier du répertoire se passe sans problème.
    Par contre, celle devant télécharger le fichier renvoie l'erreur suivante :

    {"Le serveur distant a retourné une erreur*: (501) Erreur de syntaxe dans les paramètres ou les arguments."}

    Le code utilisé est le suivant. Ligne 32, la première requête OK, ligne 72 celle posant problème.

    Code : 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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    	private const string NOT_FOUND = "Not found";
    	private const string ALREADY_EXISTS = "Already exists";
    	private const string DOWNLOADED = "Downloaded";
     
    	internal static List<DownloadResult> GetTXTFiles(string searchMask, bool bOnlyIfNew)
    	{
    		try
    		{
    			// Build URI 
    			UriBuilder uriBuilder = new UriBuilder();
    			uriBuilder.Scheme = "ftp";
    			uriBuilder.Host = "Server";
    			uriBuilder.UserName = "Login";
    			uriBuilder.Password = "Password";
    			uriBuilder.Path = "/../folder1/folder2/" + searchMask;
     
    			// Init list directory web request
    			FtpWebRequest ftpWebRequest = (FtpWebRequest)WebRequest.Create(uriBuilder.Uri);
    			ftpWebRequest.Method = WebRequestMethods.Ftp.ListDirectory;
    			ftpWebRequest.KeepAlive = false;
    			StreamReader reader = null;
    			StreamWriter writer = null;
    			FtpWebResponse response = null;
    			List<string> foundFiles = null;
     
    			try
    			{
    				// Look for files matching the mask
    				response = (FtpWebResponse)ftpWebRequest.GetResponse();
    				reader = new StreamReader(response.GetResponseStream());
    				foundFiles = reader.ReadToEnd().Split('\n').ToList();
    				foundFiles.RemoveAll(string.IsNullOrWhiteSpace);
    			}
    			finally
    			{
    				if (response != null)
    					response.Close();
    				if (reader != null)
    					reader.Close();
    			}
     
    			if (foundFiles != null && foundFiles.Count > 0)
    			{
    				// Sort the results
    				foundFiles.Sort();
     
    				// Browse the results
    				List<DownloadResult> downloadResults = new List<DownloadResult>();
    				foreach (string remoteFileName in foundFiles)
    				{
    					// Preliminary checks
    					if (remoteFileName.Contains("No such file"))
    						continue;
     
    					// Check if the file already exists
    					string localFileName = Path.Combine("C:/temp", remoteFileName);
    					if (bOnlyIfNew && File.Exists(localFileName))
    						downloadResults.Add(new DownloadResult("TXT", searchMask, Path.GetFileName(localFileName), ALREADY_EXISTS));
    					else
    					{
    						try
    						{
    							// Build download request
    							UriBuilder newUri = new UriBuilder(uriBuilder.Uri);
    							newUri.Path = newUri.Path.Replace(searchMask, remoteFileName.Replace("\r", string.Empty));
    							ftpWebRequest = (FtpWebRequest)WebRequest.Create(newUri.Uri);
    							ftpWebRequest.Method = WebRequestMethods.Ftp.DownloadFile;
     
    							// Look for files matching the mask
    							response = (FtpWebResponse)ftpWebRequest.GetResponse(); // Erreur "501" à l'exécution de cette ligne
    							writer = new StreamWriter(localFileName, false, Encoding.UTF8);
    							writer.Write(response.GetResponseStream());
    							downloadResults.Add(new DownloadResult("TXT", searchMask, Path.GetFileName(localFileName), DOWNLOADED));
    						}
    						finally
    						{
    							if (writer != null)
    								writer.Close();
    						}
    					}
    				}
    				return downloadResults;
    			}
     
    			// Nothing has been found
    			return new List<DownloadResult>() { new DownloadResult("TXT", searchMask, searchMask, NOT_FOUND) };
    		}
    		catch (Exception ex)
    		{
    			if (ex.Message.ToLower().Contains("file not found") || ex.Message.Contains("(550)"))
    				return new List<DownloadResult>() { new DownloadResult("TXT", searchMask, searchMask, NOT_FOUND) };
    			else
    				throw ex;
    		}
    	}
    }
    D'avance merci pour votre aide, je suis vraiment bloqué

  2. #2
    Membre très actif
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 618
    Billets dans le blog
    9
    Par défaut
    il faut bien changer ces propriété

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    uriBuilder.Scheme = "ftp";
    			uriBuilder.Host = "Server";
    			uriBuilder.UserName = "Login";
    			uriBuilder.Password = "Password";
    			uriBuilder.Path = "/../folder1/folder2/" + searchMask;

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Par défaut
    Citation Envoyé par charouel Voir le message
    il faut bien changer ces propriété

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    uriBuilder.Scheme = "ftp";
    			uriBuilder.Host = "Server";
    			uriBuilder.UserName = "Login";
    			uriBuilder.Password = "Password";
    			uriBuilder.Path = "/../folder1/folder2/" + searchMask;
    Bonjour et merci pour ta réponse rapide.

    Ceci est fait, me semble-t-il, correctement par les lignes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UriBuilder newUri = new UriBuilder(uriBuilder.Uri); // Je récupère les propriétés du premier UriBuilder
    newUri.Path = newUri.Path.Replace(searchMask, remoteFileName.Replace("\r", string.Empty)); // Je change le filtre de recherche par le nom exact du fichier à télécharger

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    Pour le FTP, j'utilise directement cette librairie et ça marche nickel et rapidement :

    https://sourceforge.net/projects/dotnetftplib/

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Par défaut
    Bonjour theMonz,

    Merci pour la lib, j'en utilisais une également, mais qui datait du 2.0 de mémoire. Elle était atrocement lente.
    Je me suis, du coup, lancé dans mon propre code et j'aimerais quand même comprendre


    charouel,

    J'ai essayé, par acquis de conscience, de rebatir une seconde fois l'objet UriBuilder mais cela ne change rien.

  6. #6
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Salut,

    si tu log/regarde au pas-à-pas tes newUri.Uri, ils correspondent bien à des URI FTP valides ?
    Si tu en mets un dans ton browser tu joins bien le fichier ?

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/10/2009, 17h51
  2. Coment installer un serveur pop et smtp sur un serveur local
    Par raffa dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 16/03/2006, 13h15
  3. [MySQL] Résultat de requête différent sur 2 serveurs identiques
    Par schlitters dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/12/2005, 00h24
  4. Configuration des dossiers FTP sur un serveur dédié
    Par ptit_seb dans le forum Apache
    Réponses: 4
    Dernier message: 29/09/2005, 14h53
  5. 1 requête effectuée sur 2 serveurs ?
    Par nicoPatch dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 08/02/2005, 07h44

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