web-dev-qa-db-ja.com

FTPからC#のメモリにファイルを読み取る

ローカルサーバーにダウンロードせずにFTPサーバーからファイルを読み取りたい。私は関数を書きましたが、機能しません:

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

コードを使用してMicrosoftパブリックFTPサーバーからファイルを取得する簡単な作業例を次に示します。

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.
}

コードのこの行にスラッシュがないと思います:

string url = FtpPath + FileName;

おそらくFtpPathFileNameの間ですか?

26
Kev

小さなバイナリファイル

ファイルが小さい場合、最も簡単な方法は 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);

小さなテキストファイル

小さいファイルがテキストファイルの場合は、 WebClient.DownloadString を使用します。

string contents = client.DownloadString(url);

ファイルの内容がUTF-8エンコーディングであると想定しています(ASCIIファイルでもかまいません)。別のエンコーディングを使用する必要がある場合は、 WebClient.Encodingプロパティを使用してください


大きなバイナリファイル

ファイルが大きいため、チャンク単位で処理する必要があるため、メモリ全体にロードするのではなく、 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"
    }
}

大きなテキストファイル

大きなファイルがテキストファイルであり、固定サイズのチャンクではなく行単位で処理する場合は、 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);
    }
}

繰り返しますが、これはUTF-8エンコーディングを前提としています。別のエンコーディングを使用する場合は、 StreamReaderも受け取るEncodingコンストラクタのオーバーロード を使用します。

14
Martin Prikryl

上記のコードは、2日前に見つけて使用した別のStackoverlowの例と非常によく似ています。 URI、ユーザー、パスワードを正しく設定すると、ファイルがダウンロードされ、コンテンツがFileStringに設定されます。ダウンロードせずにファイルを読みたいという意味がわかりません。これは実際にはオプションではありません。

ファイルの属性を確認したい場合( "バージョン"について言及しているようです)、次のコードを使用して、ファイルをダウンロードせずにFTPサーバーからすべてのファイルの名前、データ、サイズを取得できます。

GetFileInfoを呼び出し、ファイル名を渡します(必ず、コードを実行して、完全なFTPパス、ユーザー、およびパスワードを設定してください)。これにより、名前、日付、サイズを含むFTPFileInfoオブジェクトが返されます。

  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

エラー/例外に関する詳細なしに問題が何であるかを知ることは不可能です。

おそらく、最初の宣言の後、versionに新しい値を割り当てているようには見えません

string version = "";

コードを次のように変更してみてください

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

これは古い質問であることはわかっていますが、これを読んでいる次の人にはpath.combineを使用することをお勧めします。これらの種類の問題のクリーンアップに役立ちます。

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

CシャープGUIアプリ。最小限のftp転送。エレガントではありませんが、正常に動作します。コンソールではなくGUI。

ノアからの天気。あなたの地域を見つけてください(あなたのmetarを探してください)! METARウェザーレポートは主に、パイロットが飛行前の一部を遂行する際に使用します。

Vs 2012プレミアムRCでビルド(2012年7月)

(ボタンではなくラベルをクリックしてください)

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