当前位置: 首页 > 知识库问答 >
问题:

对存在的目录使用ListDirectoryDetails时,FtpWebRequest返回“550文件不可用(例如,找不到文件,无法访问)”

吴单鹗
2023-03-14

我有一个恼人的问题,阻止我在FTP中获取所需的文件。这个文件可能有不同的名称,所以我需要先访问文件夹,并列出其中的文件,然后直接请求该文件。

我的问题是,我可以访问这个文件在Filezilla中,例如,并完美地发现文件夹,但当使用FtpWebSolutions实例来获取文件夹,我有一个错误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个答案

虞承泽
2023-03-14

在2021年这适用于我们的Linux和Windowslive框从ftp服务器读取(在Windows和Linux)

笔记

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

TL;博士

  • 底线:URL需要以结尾/

它的工作原理是:

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/

它不工作:

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是否存在

var url = "/public_html/";
var result = FtpUtil.DoesDirectoryExists(url,  "ftp://ftp.yourdomain.com.br", "ftp user here", "ftp password here");
static bool DoesDirectoryExists(string directory, string ftpHost, string ftpUser, string ftpPassword) {
                    FtpWebRequest ftpRequest = null;
                    try {
                            ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + ftpHost + directory));
                            ftpRequest.Credentials = new NetworkCredential(ftpUser, string ftpPassword);
                            ftpRequest.UseBinary = true;// optional
                            ftpRequest.KeepAlive = false;// optional
                            ftpRequest.UsePassive = true;// optional
                            ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
        
                            using (FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse()) {
                                return true;//directory found
                            }
                    }
                    catch (WebException ex) {
                            if (ex.Response != null) {
                                FtpWebResponse response = (FtpWebResponse)ex.Response;
                                if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
                                    return false;// directory not found.  
                            }
                            return false; // directory not found.
                    }
                    finally {
                        ftpRequest = null;
                    }
        }
拓拔弘亮
2023-03-14

当<代码> FtpWebRequest <代码>解释URL时,它不考虑将主机名和路径分隔为路径的一部分的斜杠。然后,提取的路径按原样与FTPCWD命令一起使用。这意味着FTP服务器将解析相对于主目录的路径。如果您的帐户没有chrooted(客户端不将home视为root),则缺少前导斜杠会导致意外行为。

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

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

还要注意,文件夹的URL应该以斜杠结尾:为什么FtpWebRequest会为这个现有目录返回一个空流?

对于其他550问题,请参阅FtpWebRequest返回错误550文件不可用

 类似资料:
  • 我创建了一个小的windows窗体应用程序,将文件上载到我们客户的ftp站点之一。但我遇到的问题是,当我在本地机器上运行这个应用程序时,它会成功上传文件。但是如果我在我们的服务器上运行这个程序,我会收到这个错误消息; 远程服务器返回错误:(550)文件不可用(例如,找不到文件,无法访问文件),在此行“objFTPRequest.GetRequestStream();”。 有人知道为什么吗?我需要配

  • 我有这个方法来获取Java程序运行的目录。 但是,当我创建一个新的实例并将此目录作为其父目录时,它会在驱动器的根目录中返回一个。 我期望这个文件的绝对路径是,但它的。

  • 喂, 我尝试使用doxygen从一组文件夹生成代码文档。我的文件夹结构是这样的: 然后在配置文件中我在“default”配置文件中有以下设置(在这里的文档和其他问题中有说明): 我正在Linux Ubuntu(12.04LTS)上使用Doxygen1.8.4。 提前感谢您的提示和提示。

  • 在使用ProcessBuilder的目录()方法时,我试图在Java中运行一个子进程。但是,每当我使用目录()方法时,程序都会失败,说找不到文件。但是,该文件存在于工作目录中。 输出: 当我省略了catudory()方法并创建一个ProcessBuilder,例如:,它可以正常工作,firefox.exe成功启动。 这在Windows和Linux上都会发生。 我已经尝试了几个版本的启动命令(比如<

  • 问题内容: 当我尝试在IntelliJ中创建项目时,在此行上收到以下错误: 错误: 是实现 接口* 的类 * 所有软件包都存在,我可以跳转到每个接口或类的声明,但是我不知道为什么IntellJ说它无法访问或找到它们?但是是接口而不是类 上面的声明位于一个名为jar的jar文件中,并且存在于Project图书馆员中。 问题答案: 该项目包含几个模块。在将库添加到项目库后,某些模块在其依赖项中缺少它。

  • 我正在使用antlr4 maven插件构建使用antlr4的maven项目: 我从一个语法文件开始,得到了我的pom。xml设置,一切都很好。 然后,我决定将语法拆分为逻辑部分,因此使用了几个语法文件,但它们位于不同的目录中(因此生成的代码将放在单独的包中),但仍然位于同一根src/main/antlr4目录下。 我在“顶层”语法文件中使用import语句来导入其他必需的文件。 但是现在maven