当使用ListDirectoryDe​​tails作为目录时,FtpWebRequest返回“ 550文件不可用(例如,文件未找到,无法访问)”

时间:2020-10-09 07:24:51

标签: c# .net ftp ftpwebrequest

我遇到一个烦人的问题,无法在FTP中获取所需的文件。该文件的名称可能有所不同,因此我需要先访问该文件夹并列出其中的文件,然后再直接向该文件发出请求。

我的问题是,例如,我可以在Filezilla中访问此文件,并且可以完美地发现该文件夹,但是当使用FtpWebResponse实例获取该文件夹时,出现错误550

550文件不可用(例如,找不到文件,无法访问)

这是代码:

FtpWebRequest wr = (FtpWebRequest)WebRequest.Create("ftp://ftp.dachser.com/data/edi/kunden/da46168958/out");

wr.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

wr.Credentials = new NetworkCredential("login", "password");

FtpWebResponse response = (FtpWebResponse)wr.GetResponse();

Stream reponseStream = response.GetResponseStream();

StreamReader reader = new StreamReader(reponseStream);

string names = reader.ReadToEnd();

FtpWebResponse响应=(FtpWebResponse)wr.GetResponse();

是抛出错误的行

PS:生产,测试和FileZilla位于同一域,使用相同的Internet连接(如果有帮助)

感谢您的关注和反馈

FileZilla日志:

我程序中的日志,用红色圈出的错误与FTP错误无关

2 个答案:

答案 0 :(得分:2)

FtpWebRequest解释URL时,它不会将将主机名和路径分隔的斜杠视为路径的一部分。然后将提取的路径按原样与FTP CWD命令一起使用。这意味着FTP服务器将解析相对于您的主目录的路径。如果您的帐户没有被chroot(客户不将房屋视为根),则缺少前导斜线会导致意外行为。

在您的情况下,您从/remote/path开始,并使用ftp://example.com/remote/path/之类的URL,它将尝试更改为remote/path,因此最终更改为/remote/path/remote/path。那不是你想要的。

  • 您必须使用相对路径到主文件夹。在您的情况下,意味着使用没有任何路径的URL。
  • 或者使用绝对路径,您需要在主机名之后使用两个斜杠:ftp://example.com//remote/path/

还要注意,指向文件夹的URL应该以斜杠结尾:Why does FtpWebRequest return an empty stream for this existing directory?

有关其他550个问题,请参见FtpWebRequest returns error 550 File unavailable

答案 1 :(得分:0)

q)`sym`qty`price xcols lj/[a;reverse 1!'t] sym qty price length -------------------- a 1 1.1 100 b 2 2.2 200 c 3 3.3 300 这适用于我们的 Linux 和 Windows In 2021 机器从 ftp 服务器读取(在 Windows 和 Linux 上)

注意

  • Windows ftp 上的主文件夹是 web
  • Linux ftp 上的主文件夹是 public_html

TL;DR;

  • 底线:URL 需要以 /
  • 结尾

它有效:

live

它不起作用:

ftp://ftp.yourdomain.com.br/public_html/
ftp://ftp.yourdomain.com.br//public_html/
ftp://ftp.yourdomain.com.br/web/
ftp://ftp.yourdomain.com.br//web/

用法: //验证目录public_html是否存在

ftp://ftp.yourdomain.com.br/public_html
ftp://ftp.yourdomain.com.br//public_html
ftp://ftp.yourdomain.com.br/web
ftp://ftp.yourdomain.com.br//web

var url = "/public_html/";
var result = FtpUtil.DoesDirectoryExists(url,  "ftp://ftp.yourdomain.com.br", "ftp user here", "ftp password here");
相关问题