web-dev-qa-db-fra.com

Lire le fichier du FTP vers la mémoire en C #

Je souhaite lire un fichier depuis un serveur FTP sans le télécharger dans un fichier local. J'ai écrit une fonction mais ça ne marche pas:

private string GetServerVersion()
{
    WebClient request = new WebClient();

    string url = FtpPath + FileName;
    string version = "";

    request.Credentials = new NetworkCredential(ftp_user, ftp_pas);

    try
    {
        byte[] newFileData = request.DownloadData(new Uri(FtpPath)+FileName);
        string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
    }
    catch (WebException e)
    {
    }
    return version;
}
14
Mselmi Ali

Voici un exemple de travail simple utilisant votre code pour récupérer un fichier à partir des serveurs FTP publics de Microsoft:

WebClient request = new WebClient();
string url = "ftp://ftp.Microsoft.com/developr/fortran/" +"README.TXT";
request.Credentials = new NetworkCredential("anonymous", "[email protected]");

try
{
  byte[] newFileData = request.DownloadData(url);
  string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
  Console.WriteLine(fileString);
}
catch (WebException e)
{
  // Do something such as log error, but this is based on OP's original code
  // so for now we do nothing.
}

Je suppose que vous manquez une barre oblique sur cette ligne ici dans votre code:

string url = FtpPath + FileName;

Peut-être entre FtpPath et FileName?

26
Kev

Petit fichier binaire

Si le fichier est petit, la méthode la plus simple consiste à utiliser WebClient.DownloadData :

WebClient client = new WebClient();
string url = "ftp://ftp.example.com/remote/path/file.Zip";
client.Credentials = new NetworkCredential("username", "password");
byte[] contents = client.DownloadData(url);

Petit fichier texte

Si le petit fichier est un fichier texte, utilisez WebClient.DownloadString :

string contents = client.DownloadString(url);

Il suppose que le contenu du fichier est en encodage UTF-8 (un fichier simple ASCII fera aussi l'affaire). Si vous devez utiliser un encodage différent, utilisez WebClient.Encoding propriété .


Grand fichier binaire

Si le fichier est volumineux, de sorte que vous devez le traiter en morceaux, au lieu de le charger dans la mémoire entière, utilisez FtpWebRequest :

FtpWebRequest request =
    (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.Zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.DownloadFile;

using (Stream stream = request.GetResponse().GetResponseStream())
{
    byte[] buffer = new byte[10240];
    int read;
    while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
    {
        // process the chunk in "buffer"
    }
}

Grand fichier texte

Si le gros fichier est un fichier texte et que vous souhaitez le traiter par lignes, plutôt que par morceaux d'une taille fixe, utilisez StreamReader :

FtpWebRequest request =
    (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.txt");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.DownloadFile;

using (Stream stream = request.GetResponse().GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
    while (!reader.EndOfStream)
    {
        string line = reader.ReadLine();
        // process the line
        Console.WriteLine(line);
    }
}

Encore une fois, cela suppose un codage UTF-8. Si vous souhaitez utiliser un autre encodage, utilisez un constructeur surcharge de StreamReader qui prend également Encoding .

14
Martin Prikryl

Le code que vous avez ci-dessus est très similaire à un autre exemple de Stackoverlow que j'ai trouvé et utilisé il y a 2 jours. Si vous définissez correctement l'URI, l'utilisateur et le mot de passe, il télécharge le fichier et définit le contenu sur FileString. Je ne sais pas ce que vous voulez dire en voulant lire le fichier sans le télécharger. Ce n'est pas vraiment une option.

Si vous voulez regarder les attributs de fichier (je vois que vous mentionnez "version"), vous pouvez utiliser le code ci-dessous pour obtenir tous les nom, données et taille du fichier depuis le serveur FTP sans télécharger le fichier.

Appelez GetFileInfo et transmettez le nom du fichier (assurez-vous de suivre le code pour définir le chemin FTP complet, l'utilisateur et le mot de passe). Cela vous donnera un objet FTPFileInfo avec un nom, une date et une taille.

  public static FTPFileInfo GetFileInfo(string fileName)
        {
            var dirInfo = WordstockExport.GetFTPDirectoryDetails();
            var list = FTPFileInfo.Load(dirInfo);
            try
            {
                FTPFileInfo ftpFile = list.SingleOrDefault(f => f.FileName == fileName);
                return ftpFile;
            }
            catch { }
            return null;
        }
     class FTPFileInfo
        {
            private DateTime _FileDate;
            private long _FileSize;
            private string _FileName;

            public DateTime FileDate
            {
                get { return _FileDate; }
                set { _FileDate = value; }
            }
            public long FileSize
            {
                get { return _FileSize; }
                set { _FileSize = value; }
            }
            public string FileName
            {
                get { return _FileName; }
                set { _FileName = value; }
            }

            public FTPFileInfo() { }
            public static FTPFileInfo LoadFromLine(string line)
            {
                FTPFileInfo file = new FTPFileInfo();

                string[] ftpFileInfo = line.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                file._FileDate = DateTime.Parse(ftpFileInfo[0] + " " + ftpFileInfo[1]);
                file._FileSize = long.Parse(ftpFileInfo[2]);
                file._FileName = ftpFileInfo[3];

                return file;

            }
            public static List<FTPFileInfo> Load(string listDirectoryDetails)
            {
                List<FTPFileInfo> files = new List<FTPFileInfo>();

                string[] lines = listDirectoryDetails.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                foreach(var line in lines)
                    files.Add(LoadFromLine(line));

                return files;
            }

        }
       private static string GetFTPDirectoryDetails()
            {
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(App.Export_FTPPath);
                request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
                request.Credentials = new NetworkCredential(App.FTP_User, App.FTP_Password);
                FtpWebResponse response = (FtpWebResponse)request.GetResponse();

                Stream responseStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(responseStream);
                string fileLines = reader.ReadToEnd();
                reader.Close();
                response.Close();

                return fileLines;
            }
2
Jemes
WebClient request = new WebClient();
string url = "ftp://ftp.Microsoft.com/developr/fortran/" +"README.TXT";
request.Credentials = new NetworkCredential("anonymous", "[email protected]");
request.Proxy = null;

try
{
  byte[] newFileData = request.DownloadData(url);
  string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
  Console.WriteLine(fileString);
}
catch (WebException e)
{
  // Do something such as log error, but this is based on OP's original code
  // so for now we do nothing.
}
0
Sambath Kumar S

Il est impossible de savoir quel est le problème sans détails sur l'erreur/exception.

À une supposition, vous ne semblez pas affecter une nouvelle valeur à version après la déclaration initiale

string version = "";

Essayez de changer votre code en

version = System.Text.Encoding.UTF8.GetString(newFileData);
0
Longball27

Je sais que c'est une vieille question, mais j'ai pensé que je suggérerais d'utiliser path.combine pour le prochain gars qui lirait ceci. Aide à nettoyer ce genre de problèmes.

        string url = Path.Combine("ftp://ftp.Microsoft.com/developr/fortran", "README.TXT");
0
James R

Application C Sharp GUI. Transfert ftp minimal, pas élégant mais cela fonctionne bien. GUI, pas de console.

Météo de Noaa. Trouvez votre région (recherchez votre metar)! Un bulletin météorologique METAR est principalement utilisé par les pilotes pour exécuter une partie d'un

Construire avec vs 2012 RC premium (juillet 2012)

(cliquez sur l'étiquette, pas sur le bouton)

using System;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Collections.Generic;

namespace getweather
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        } 

         private void button2_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void CYYY_Click(object sender, EventArgs e)
        {
            WebClient request = new WebClient();
            string url = "ftp://tgftp.nws.noaa.gov/data/observations/metar/decoded/CYYY.TXT";
            request.Credentials = new NetworkCredential("anonymous", "[email protected]");
            byte[] newFileData = request.DownloadData(url);
            string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
            richTextBox1.Text = fileString;
        }

        private void CYSC_Click(object sender, EventArgs e)
        {
            WebClient request = new WebClient();
            string url = "ftp://tgftp.nws.noaa.gov/data/observations/metar/decoded/CYSC.TXT";
            request.Credentials = new NetworkCredential("anonymous", "[email protected]");
            byte[] newFileData = request.DownloadData(url);
            string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
            richTextBox1.Text = fileString;

        }

        private void CYQB_Click(object sender, EventArgs e)
        {
            WebClient request = new WebClient();
            string url = "ftp://tgftp.nws.noaa.gov/data/observations/metar/decoded/CYQB.TXT";
            request.Credentials = new NetworkCredential("anonymous", "[email protected]");
            byte[] newFileData = request.DownloadData(url);
            string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
            richTextBox1.Text = fileString;

        }

        private void CYUY_Click(object sender, EventArgs e)
        {
            WebClient request = new WebClient();
            string url = "ftp://tgftp.nws.noaa.gov/data/observations/metar/decoded/CYUY.TXT";
            request.Credentials = new NetworkCredential("anonymous", "[email protected]");
            byte[] newFileData = request.DownloadData(url);
            string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
            richTextBox1.Text = fileString;

        }

        private void CYHU_Click(object sender, EventArgs e)
        {
            WebClient request = new WebClient();
            string url = "ftp://tgftp.nws.noaa.gov/data/observations/metar/decoded/CYHU.TXT";
            request.Credentials = new NetworkCredential("anonymous", "[email protected]");
            byte[] newFileData = request.DownloadData(url);
            string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
            richTextBox1.Text = fileString;

        }
    }
}
0
stephane Marchand