41

次のコードは、FTP経由でファイルを取得することを目的としています。ただし、エラーが発生します。

serverPath = "ftp://x.x.x.x/tmp/myfile.txt";

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath);

request.KeepAlive = true;
request.UsePassive = true;
request.UseBinary = true;

request.Method = WebRequestMethods.Ftp.DownloadFile;                
request.Credentials = new NetworkCredential(username, password);

// Read the file from the server & write to destination                
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) // Error here
using (Stream responseStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream))            
using (StreamWriter destination = new StreamWriter(destinationFile))
{
    destination.Write(reader.ReadToEnd());
    destination.Flush();
}

エラーは次のとおりです。

リモートサーバーがエラーを返しました:(550)ファイルが利用できません(ファイルが見つからない、アクセスできないなど)

ファイルは確かにリモートマシンに存在し、このftpを手動で実行できます(つまり、アクセス許可があります)。なぜこのエラーが発生するのか誰か教えてもらえますか?

4

8 に答える 8

53

これは古い投稿であることはわかっていますが、今後の参考のためにここに追加します。これが私が見つけた解決策です:

    private void DownloadFileFTP()
    {
        string inputfilepath = @"C:\Temp\FileName.exe";
        string ftphost = "xxx.xx.x.xxx";
        string ftpfilepath = "/Updater/Dir1/FileName.exe";

        string ftpfullpath = "ftp://" + ftphost + ftpfilepath;

        using (WebClient request = new WebClient())
        {
            request.Credentials = new NetworkCredential("UserName", "P@55w0rd");
            byte[] fileData = request.DownloadData(ftpfullpath);

            using (FileStream file = File.Create(inputfilepath))
            {
                file.Write(fileData, 0, fileData.Length);
                file.Close();
            }
            MessageBox.Show("Download Complete");
        }
    }

Ilya Kogan による優れた提案に基づいて更新

于 2011-09-23T23:35:32.040 に答える
26

FptWebRequestクラスリファレンスのこの段落は、あなたにとって興味深いかもしれません。

URIは相対的または絶対的です。URIの形式が「ftp://contoso.com/%2fpath」(%2fはエスケープされた「/」)の場合、URIは絶対であり、現在のディレクトリは/pathです。ただし、URIの形式が「ftp://contoso.com/path」の場合、最初に.NET FrameworkがFTPサーバーにログインし(Credentialsプロパティで設定されたユーザー名とパスワードを使用)、次に現在のディレクトリにログインします。 /pathに設定されます。

于 2010-05-06T14:20:59.253 に答える
2

私は同じ問題を抱えていました!

私の解決策は、public_htmlフォルダーをダウンロード URL に挿入することでした。

サーバー上の実際のファイルの場所:

myhost.com/public_html/myimages/image.png

ウェブ URL:

www.myhost.com/myimages/image.png

于 2012-07-10T09:54:02.837 に答える
2
    private static DataTable ReadFTP_CSV()
    {
        String ftpserver = "ftp://servername/ImportData/xxxx.csv";
        FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpserver));

        reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();

        Stream responseStream = response.GetResponseStream();

        // use the stream to read file from FTP 
        StreamReader sr = new StreamReader(responseStream);
        DataTable dt_csvFile = new DataTable();

        #region Code
        //Add Code Here To Loop txt or CSV file
        #endregion

        return dt_csvFile;

    }

お役に立てば幸いです。

于 2016-11-10T05:10:33.127 に答える
0
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath);

この後、エラーを回避するために以下の行を使用できます。(アクセスが拒否されたなど)

request.Proxy = null;
于 2012-11-15T16:35:38.443 に答える