Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么FtpWebRequest会为此现有目录返回空流?_C#_.net_Ftp_Ftpwebrequest_Ftpwebresponse - Fatal编程技术网

C# 为什么FtpWebRequest会为此现有目录返回空流?

C# 为什么FtpWebRequest会为此现有目录返回空流?,c#,.net,ftp,ftpwebrequest,ftpwebresponse,C#,.net,Ftp,Ftpwebrequest,Ftpwebresponse,我不知道为什么我会得到这个结果。我在Linux服务器上运行这个。(这是我的小型网站的共享web托管帐户。) 文件分组如下: 而另一个Dir中有一个文件: 因此,我尝试检索服务器上不存在的1somelongdir1234567目录中的badname目录的内容,使用以下代码: try { FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create( "ftp://server12.some-domain

我不知道为什么我会得到这个结果。我在Linux服务器上运行这个。(这是我的小型网站的共享web托管帐户。)

文件分组如下:

另一个Dir
中有一个文件:

因此,我尝试检索服务器上不存在的
1somelongdir1234567
目录中的
badname
目录的内容,使用以下代码:

try
{
    FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(
        "ftp://server12.some-domain.com/public_html/1somelongdir1234567/badname");
    ftpRequest.EnableSsl = true;
    ftpRequest.Credentials = new NetworkCredential("user", "password");
    ftpRequest.KeepAlive = true;
    ftpRequest.Timeout = -1;

    ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

    using (FtpWebResponse response1 = (FtpWebResponse)ftpRequest.GetResponse())
    {
        //*****BEGIN OF EDIT*****
        Console.WriteLine(response1.StatusDescription);
        Console.WriteLine(response1.StatusCode);
        //*****END OF EDIT*****

        using (StreamReader streamReader = new StreamReader(response1.GetResponseStream()))
        {
            List<string> arrList = new List<string>();

            for (; ; )
            {
                string line = streamReader.ReadLine();

                //I get to here, where `line` is null????

                if (string.IsNullOrEmpty(line))
                    break;

                arrList.Add(line);

                //*****BEGIN OF EDIT*****
                Console.WriteLine(line);
                //*****END OF EDIT*****
            }
        }
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}
streamReader.ReadLine()
仍然返回
null

有人能解释一下原因吗


编辑:好的,伙计们,我更新了上面的代码来检索状态代码。不过我还是很困惑

首先,这里是连接URI的三个值和我得到的响应/输出:

示例1:

//现有文件夹
"ftp://server12.some-domain.com/public_html/1somelongdir1234567"
输出:

150接受的数据连接
开放数据
drwxr-xr-x 3用户名4096 Sep 5 05:51。
drwxr-x---118用户名99 4096 9月5日05:54。。
drwxr-xr-x 2用户名4096 Sep 5 05:52另一个目录
-rw-r--r--1用户名用户名11 Sep 5 05:51 test123.txt
示例2:

//另一个现有文件夹
"ftp://server12.some-domain.com/public_html/1somelongdir1234567/Another%20Dir"
输出:

150接受的数据连接
开放数据
示例3:

//不存在的文件夹
"ftp://server12.some-domain.com/public_html/1somelongdir1234567/SomeBogusName"
输出:

150接受的数据连接
开放数据
那么,为什么它给我的结果和我给3的结果是一样的呢

至于它是什么ftp服务器,我无法在网络日志或
FtpWebRequest
本身中看到它。以下是我从Microsoft网络监视器
获得的信息:

欢迎来到纯FTPd[privesep][TLS]--------------..
220您是允许的50个用户中的4个。。。 当地时间现在是13点14分。服务器端口:21…
220这是一个专用系统-无匿名登录..
此服务器上也欢迎220-IPv6连接…
220您将在15分钟不活动后断开连接


正如stuartd所指出的,据我所知,由于FTP命令的工作方式,当服务器无法执行您请求的命令时,您永远不会得到异常。服务器将通过FTP响应代码告诉您失败

您必须意识到的一件事是,FTP对它发送回的文本没有标准,因为它从来没有被设计成机器解释它的响应。如果您有时间,可以查找并检查他们的类以解释文件列表(directorylistingparser.cpp)。有几十种方法可以解释它,应用程序只需尝试所有方法,直到其中一种有效。因为,除非你知道你连接的是哪种FTP,否则这是唯一的方法

因此,如果特定服务器决定在您请求一个不存在的目录时发回一个空字符串,这就是他们的FTP实现的方式,而客户机的问题是如何理解这意味着什么


如果您无法从FTP响应代码中判断这是失败的,您可以测试它是否为现有但为空的文件夹返回了不同的内容。如果是这样,您可以很容易地区分该响应和该空响应,并将该空响应视为程序中的“未找到”错误。

通常,
ListDirectory
/
ListDirectoryDetails
方法的URL应以斜杠结尾

如果没有斜线,结果往往是不确定的

WebRequest.Create("ftp://example.com/public_html/1somelongdir1234567/Another%20Dir/");

嗯,是的,这让我很困惑。对不起,我对ftp这件事还不太熟悉。我用更多的细节更新了我原来的帖子。但我仍然对我收到的东西感到困惑。例如,为什么我在现有目录上得到一个空响应?我假设,因为文件夹是空的?否。空文件夹将返回
”。“
”。上面@MartinPrikryl指出了它不起作用的原因。我希望事情不是那么简单:哦,老兄。这就是我所需要的?最后一道可怕的斜线!!!天啊,我花了24小时才完成D谢谢!
WebRequest.Create("ftp://example.com/public_html/1somelongdir1234567/Another%20Dir/");